力扣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. 链表求和]
代码随想录算法训练营第四天 | 24.两两交换链表中的节点19.删除链表的倒数第N个节点160.相交链表142.环形链表II