思路:
设几个变量:
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;
}