力扣142. 环形链表 II

Posted mr.chenyuelin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了力扣142. 环形链表 II相关的知识,希望对你有一定的参考价值。

题目:
在这里插入图片描述
本题使用快慢指针,
第一步:只要快慢指针能相遇就有环,相遇点在环中
第二步:当从相遇点和头结点都有一个指针以相同速度出发,第二次相遇就是环形入口,为什么?
在这里插入图片描述

设头结点到环形入口点距离为a,入口点到相遇点距离为b

慢指针走的路程为c=a+b,而快指针速度是满指针的两倍,2c=2a+2b,轨迹为A->B>C>D>B>C,其中BC走两次为2b,AB为a,所以从C点到B点这段距离为a,也就是头结点A到环形入口点距离B

代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        ListNode* fast=head;
        ListNode* slow=head;
        while(fast!=NULL&&fast->next!=NULL)
        {
            fast=fast->next->next;
            slow=slow->next;
            if(fast==slow)break;
        }
        //判断是否有环
        if(fast==NULL||fast->next==NULL)return NULL;
        slow=head;
        while(fast!=slow)
        {
            fast=fast->next;
            slow=slow->next;
        }
        return slow;
    }
};

补充:当尾节点到环入口点有其它节点时,也是这样子不变

以上是关于力扣142. 环形链表 II的主要内容,如果未能解决你的问题,请参考以下文章

力扣算法JS LC [142. 环形链表 II]LC [面试题 02.05. 链表求和]

力扣142. 环形链表 II

力扣142. 环形链表 II

力扣142. 环形链表 II

[LeetCode]142. 环形链表 II

代码随想录算法训练营第四天 | 24.两两交换链表中的节点19.删除链表的倒数第N个节点160.相交链表142.环形链表II