F_G

许多问题需要说清楚就可以&&走永远比跑来的重要

导航

[Leetcode] Linked List Cycle II

如何找到环的起始位置?算法大家估计都已经是耳熟能详了,关键是证明。

我们假设从起始位置到环的起点的长度为X,相遇位置离起始点的距离为K,环的长度为Y,由于fast pointer的速度是low pointer的两倍。所以

X+mY+K=2*(X+nY+K)

X+K=(m-2n)Y

从这个等式可以解释为什么:慢指针从相遇处,快指针从起点处,以相同速率移动,最后一定会在环的起点处相遇。

快指针从起点第一次走到环的K位置的时候正好达到环的长度的整数倍,那么当他到达环的开始的时候,实际上还有K步可以达到环长度的整数倍;对于慢指针来说,他是在环上移动,本身相对于起点来说已经移动了k步,那么当他到达环的起点的时候,实际上距离环长度的整数倍也是有K步,所以,两者在环的起始位置肯定能够相遇。

 

参考当中有一个非常好的证明

[1] http://blog.csdn.net/sbitswc/article/details/27584037

posted on 2015-08-18 09:15  F_G  阅读(115)  评论(0编辑  收藏  举报