鉴于网上的讲解都瞎写, 只能自己再写一遍

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;
    }
};