
鉴于网上的讲解都瞎写, 只能自己再写一遍
1
快慢指针不用说了吧 , 在环内某个点相遇, 相遇时使用的循环次数用N表示
慢指针 A + B= N
快指针 A + k * C + B = 2N
网上很多把这个 k*C 写错了!!! 而且还到处转载, 害人不浅 .
快指针可能在环里面转了很多圈! k代表圈数, 无法得知是多少圈
2
吐槽 我感觉这tm完全是几何数学题, 跟编程有毛关系..
3
基本的公式求解得到 A + B = k*C , 然后发现并没有什么卵用, 因为这里并不是要我们多项式求解, 两个公式 一堆未知数, 数学知识告诉我们不可能解出来的
4
重点来了, 这时候把慢指针重新赋值为链表头结点, 重新开始循环遍历
注意! 这里慢指针, 快指针 都是每次前进一步, 而不是一个一步一个两步!
循环结果一定是这俩指针还会在 环的入口 处相遇!
5
根据 A + B = k*C 这个结论应该能想明白吧;
慢指针到环入口的距离A
快指针在环里面转圈, 到达入口时的距离 k*C - B; A=k*C -B 就变成了 A+B=k*C
就是这样
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
if(NULL==head)return head;
ListNode *fast=head,*slow=head;
while(fast->next&&fast->next->next)
{
slow=slow->next;
fast=fast->next->next;
if(slow==fast)break;
}
if(NULL==fast->next||NULL==fast->next->next)return NULL;
slow=head;
while(slow!=fast)
{
slow=slow->next;
fast=fast->next;
if(slow==fast)return slow;
}
return slow;
}
};
浙公网安备 33010602011771号