[LeetCode] 142. Linked List Cycle II

来源:互联网 发布:刷淘宝单软件 编辑:程序博客网 时间:2024/05/07 00:28

思路:
设几个变量:
a: 链表头到循环头的距离
b: 循环头到相遇点的距离
c: 相遇点到循环头的距离
n: 循环次数
第一次快慢两个节点相遇时, 快节点走的距离是 a + (b + c) * n1 + b, 慢节点走的距离是 a + (b + c) * n2, 然后 a + (b + c) * n1 = 2 * (a + (b + c) * n2), 但我们不用关注那些走过的整圈, (b + c)的倍数都直接消掉即可. 所以我们就有a == c. 所以两个节点相遇以后, 我们再用start指针和walker指针一起向前移动, 直到他们相遇, 相遇点就是循环起始点.

可以参考一下这个博客, 写的很好http://www.jianshu.com/p/ce7f035daf74

ListNode *detectCycle(ListNode *head) {    if (! head || ! head->next) return NULL;    ListNode* walker = head;    ListNode* runner = head;    ListNode* start = head;    while (runner->next && runner->next->next) {        walker = walker->next;        runner = runner->next->next;        if (walker == runner) {            while (walker != start) {                walker = walker->next;                start = start->next;            }            return start;        }    }    return NULL;}
0 0