LeetCode 142.环形链表II

LeetCode 142.环形链表II_第1张图片

文章目录

  • 题目分析
  • 解题思路
  • 深度思考
  • 接口源码

在这里插入图片描述
题目链接 LeetCode 142.环形链表II

题目分析

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

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

LeetCode 142.环形链表II_第2张图片
LeetCode 142.环形链表II_第3张图片
LeetCode 142.环形链表II_第4张图片
LeetCode 142.环形链表II_第5张图片

解题思路

先使用快慢指针找到相遇点(定义两个指针,一个快指针、一个慢指针,让快指针一次走一步,慢指针一次走两步,如果存在环的话,快指针会先进环,一直在环中循环的走,等到慢指针也进入环中循环,快指针追击慢指针,最后它们一定会相遇,找到相遇点),然后一个指针从相遇点开始走,一个指针从链表头开始走,最终他们会在入口点相遇

深度思考

LeetCode 142.环形链表II_第6张图片
fast走的路程是slow的2倍

假设:
链表头 ---- 环入口点的距离:L
环入口点 ---- 相遇点的距离:X
环的长度:C
slow走的路程是多少?

slow走的路程为:L+X

分析:有没有可能slow进环转了几圈才追上?

不可能!1圈之内,fast必然追上slow,因为他们之间距离每次缩小1,不会错过,slow走1圈,fast都已经走2圈了,肯定追上了。

fast走的路程是多少?

fast走的路程为:L+C+X ?
LeetCode 142.环形链表II_第7张图片

fast走的路程应该为:L + n*C + X
假设n是slow进环前,fast在环里面转的圈数
LeetCode 142.环形链表II_第8张图片
LeetCode 142.环形链表II_第9张图片

接口源码

struct ListNode *detectCycle(struct ListNode *head)
{
    struct ListNode* slow = head,*fast = head;
    while(fast && fast->next)
    {
        slow = slow->next;
        fast = fast->next->next;

        //带环
        if(slow == fast)
        {
            //求入口点
            struct ListNode* meet = slow;
            while(head != meet)
            {
                head = head->next;
                meet = meet->next;
            }

            return meet;
        }
    }

    return NULL;
}

LeetCode 142.环形链表II_第10张图片

希望烙铁们能够理解欧!

总结
以上就是本题讲解的全部内容啦
本文章所在【C/C++刷题系列】专栏,感兴趣的烙铁可以订阅本专栏哦
前途很远,也很暗,但是不要怕,不怕的人面前才有路。
小的会继续学习,继续努力带来更好的作品
创作写文不易,还多请各位大佬uu们多多支持哦

请添加图片描述

你可能感兴趣的:(C/C++刷题系列,leetcode,链表,算法,数据结构,c语言)