找循环链表的循环点

一个快指针(慢指针的两倍),一个慢指针,如果有循环必定相遇。

假设起点到循环点长度为a,相遇点到循环点长度为b,循环剩下长度为c。

则很容易得到:

2*(a+b)==a+b+n*(b+c);

变形得:

a=(n-1)*(b+c)+c;

可以得出,再次另一个指针指向链表头,和相遇点指针同速前进,必定在循环点相遇。

 

Phase 2 diagram
posted @ 2018-03-29 14:37  eel808  阅读(389)  评论(0)    收藏  举报