鉴于网上的讲解都瞎写, 只能自己再写一遍
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; } };