单链表OJ题:LeetCode--142.环形链表Ⅱ(判断第一次入环的节点)

这篇具有很好参考价值的文章主要介绍了单链表OJ题:LeetCode--142.环形链表Ⅱ(判断第一次入环的节点)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

朋友们、伙计们,我们又见面了,本期来给大家解读一下LeetCode中第142道单链表OJ题,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成!

 文章来源地址https://www.toymoban.com/news/detail-475688.html

数据结构与算法专栏数据结构与算法

个  人  主  页 :stackY、

C 语 言 专 栏C语言:从入门到精通

单链表OJ题:LeetCode--142.环形链表Ⅱ(判断第一次入环的节点)

LeetCode--142.环形链表Ⅱ: https://leetcode.cn/problems/linked-list-cycle-ii/description/

目录

1.题目介绍

2.实例演示

3.解题思路

4.思路验证 

5.其他解题方法


1.题目介绍

给定一个链表的头节点  head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。不允许修改 链表。

单链表OJ题:LeetCode--142.环形链表Ⅱ(判断第一次入环的节点)

2.实例演示

单链表OJ题:LeetCode--142.环形链表Ⅱ(判断第一次入环的节点)

3.解题思路

小编在这里给大家推荐比较简单的解题思路,同样的都是使用快慢指针的,我们先来讲具体的解题思路,后面会验证这种方法的正确性:

        同样的还是设置快慢指针,慢指针一次走一步,快指针一次走两步,同样的我们先来判断链表是否有环(如何判断链表有环大家可以去看LeetCode:141.环形链表这篇博客,里面包含了具体解题思路),在判断是否有环之后呢,我们要找到第一次入环的节点,那这个就比较麻烦了,该怎么找呢?小编在这里给大家提供一个简单的解法:记录环中快慢指针相遇的节点(meet),然后让一个指针从链表的头(head)开始走,一次都走一步,当meet和head相遇时它们就是第一次入环的节点。

代码演示:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode *detectCycle(struct ListNode *head) {
    //设置快慢指针
    struct ListNode* slow = head;
    struct ListNode* fast = head;
    //快慢指针的相遇节点
    struct ListNode* meet = NULL;

    //判断是否有环
    while(fast && fast->next)
    {
        fast = fast->next->next;
        slow = slow->next;
        //若有环则记录快慢指针的相遇节点
        if(fast == slow)
        {
            meet = slow;
            //找第一次入环的节点
            while(meet != head)
            {
                //一次都走一步
                meet = meet->next;
                head = head->next;
            }

            return meet;
        }
    }
    //无环则返回NULL
    return NULL;
}

4.思路验证 

要求环形链表第一次入环的节点,我们使用的这种快慢指针的方法是很简单的,也是很巧妙的,这种方法具体是怎么实现的,让我们接着往下来看:

我们假设环的长度为C,链表的头到第一次入环节点的距离为L,第一次入环的节点到相遇点的距离为X。

单链表OJ题:LeetCode--142.环形链表Ⅱ(判断第一次入环的节点)

慢指针在这里有一个分析问题:slow有没有可能在环里面转了好几圈快指针才追上?

答案是肯定不可能,因为快指针的速度是慢指针的2倍,不存在错过的情况,所以慢指针不存在走好几圈才能被快指针追上的情况。

很多老铁在这里验证的时候使用了一种错误的验证方法:

慢指针slow走的路程是:L + X

快指针fast走的路程是:L + X + C

那么就有一种对应的关系:2 * (L + X) =  L + X + C

                                                         L = C - X

这种方法有一个弊端,比如一个环形链表前面进环的路程(L)非常的长,而环(C)又非常的小,那这就出现问题了:

单链表OJ题:LeetCode--142.环形链表Ⅱ(判断第一次入环的节点)

所以呢我们可以将这种特殊的情况考虑进去,那么我们应该先算快指针fast走的路程:

快指针fast走的路程:L + n * C + X(n为慢指针进环之前快指针在环里面走过的圈数)

慢指针slow走的路程是:L + X

那么就有一种对应的关系: 2 * (L + X) =  L + X + n * C

                                                             L = n * C - X

那么这样解释起来就好多了,相遇节点到第一次入环的节点的距离为C - X

头节点到第一次入环节点的距离为L,那么根据 L = n * C - X这个对应关系,就可以推出从相遇节点每次走一步,头指针每一次走一步,当它们两个相遇的时候就是这个环形链表第一次入环的节点。

单链表OJ题:LeetCode--142.环形链表Ⅱ(判断第一次入环的节点)

 

5.其他解题方法

除了上面我们验证的这个方法外,还有另外的一种方法,小编在这里只说思路,感兴趣的老铁可以自己尝试一下:

分割环形链表法:

可以记录快慢指针的相遇节点,然后以这个相遇点为起点,保存并记录相遇节点的下一个节点,然后将相遇节点和它的下一个节点断开链接,将这个环一分为二,这时就转换成了链表相交的问题。

一个链表是从头开始,另一个链表的头是从相遇点的下一个节点,那么这两个链表的相交节点就是第一次入环的节点。

单链表OJ题:LeetCode--142.环形链表Ⅱ(判断第一次入环的节点)

感兴趣的老铁可以自己动手写一下完整的代码。 

朋友们、伙计们,美好的时光总是短暂的,我们本期的的分享就到此结束,最后看完别忘了留下你们弥足珍贵的三连喔,感谢大家的支持!

 

 

到了这里,关于单链表OJ题:LeetCode--142.环形链表Ⅱ(判断第一次入环的节点)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • leetcode 142 环形链表II

    给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从

    2024年02月01日
    浏览(39)
  • 【Leetcode】142.环形链表II

    题意: 给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 为了表示给定链表中的环,使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。 说明 :不允许修改给定的链表。 一开始我是这么写的

    2024年02月16日
    浏览(34)
  • LeetCode:142. 环形链表 II

    🍎道阻且长,行则将至。🍓 🌻算法,不如说它是一种思考方式🍀 算法专栏: 👉🏻123 题目描述 :给定一个链表的头节点 head ,返回链表开始 入环的第一个节点 。 如果链表无环,则返回 null 。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在

    2024年02月07日
    浏览(45)
  • LeetCode刷题:142. 环形链表 II

    题目: 是否独立解决: 否,参考了解题思路解决问题,思考了用快慢指针,栈,统计链表数量定位尾巴节点(因为是环形链表所以是死循环,链表数量用while循环统计不出来)都没解决 解题思路:这题其实和环形链表一样的解题思路,用哈希set将数据都存储进去,如果发现

    2024年01月21日
    浏览(42)
  • ​LeetCode解法汇总142. 环形链表 II

    https://github.com/September26/java-algorithms 给定一个链表的头节点   head  ,返回链表开始入环的第一个节点。  如果链表无环,则返回  null 。 如果链表中有某个节点,可以通过连续跟踪  next  指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 

    2024年02月14日
    浏览(42)
  • LeetCode[141] [142] 环形链表I II

    141. 环形链表 - 力扣(LeetCode) 142. 环形链表 II - 力扣(LeetCode) 题解: 快慢指针题 从head开始,一个快指针,一次前进两步,一个慢指针,一次走一步 如果没有环,则快指针首先到达链表尾部, 如果有环,快慢指针肯定能相遇即fast=slow 141代码: 对于142需要环的起点,需要

    2024年02月04日
    浏览(46)
  • [LeetCode]-160. 相交链表-141. 环形链表-142.环形链表II-138.随机链表的复制

    目录 160.相交链表  题目 思路 代码  141.环形链表  题目 思路 代码 142.环形链表II 题目 思路 代码 160. 相交链表 - 力扣(LeetCode) https://leetcode.cn/problems/intersection-of-two-linked-lists/description/ 给你两个单链表的头节点  headA  和  headB  ,请你找出并返回两个单链表相交的起始节点

    2024年02月05日
    浏览(52)
  • leetcode 141.环形链表 I - 142.环形链表 II 代码及指针相遇证明问题

    给你一个链表的头节点 head ,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 如果链表中存在环 ,则返回 true 。 否则,返回 false 。 思路: 快慢指针问题 。我们可以声明一个 fast 指针(一次走两步),声明一个 slow

    2024年02月12日
    浏览(64)
  • 代码随想录 Leetcode142. 环形链表 II

            双指针解决百分之99的链表题

    2024年01月19日
    浏览(46)
  • 【刷题专栏—突破思维】LeetCode 142. 环形链表 II

    前言 :本篇博客将讲解三个OJ题,前两个作为铺垫,最后完成环形链表的节点的寻找 题目链接:LeetCode—相交链表 题目描述: 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节

    2024年02月05日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包