如何找到环的起始位置?算法大家估计都已经是耳熟能详了,关键是证明。
我们假设从起始位置到环的起点的长度为X,相遇位置离起始点的距离为K,环的长度为Y,由于fast pointer的速度是low pointer的两倍。所以
X+mY+K=2*(X+nY+K)
X+K=(m-2n)Y
从这个等式可以解释为什么:慢指针从相遇处,快指针从起点处,以相同速率移动,最后一定会在环的起点处相遇。
快指针从起点第一次走到环的K位置的时候正好达到环的长度的整数倍,那么当他到达环的开始的时候,实际上还有K步可以达到环长度的整数倍;对于慢指针来说,他是在环上移动,本身相对于起点来说已经移动了k步,那么当他到达环的起点的时候,实际上距离环长度的整数倍也是有K步,所以,两者在环的起始位置肯定能够相遇。
参考当中有一个非常好的证明
[1]