为什么在环中一定会相遇,只看两种情况
- 第一种:
...->1(fast)->2(slow)->3->...
此时两者相临,
快指针走两个节点,慢指针走一个节点,两者在下一个时刻必相遇
...->1->2->3(fast & slow)->...
- 第二种:
...->1(fast)->2->3(slow)->4->...
此时两者相差一个节点,
快指针走两个节点,慢指针走一个节点,之后回到第一种情况
...->1->2->3(fast)->4(slow)->...
两者在下一个时刻必相遇,
简单公式描述
- 假设慢指针速度为v,快指针速度为2v,
- 则两者中间相隔的距离 L = 两者相遇需要的时间 t
- vt+L = 2vt,即 L = vt,
- 而 v =1 ,则有 L = t;
寻找环入口
假设快慢指针在环内相遇有:
- 慢指针走的路程为 L+r,其中L为环外的路程,r为环内的路程;
- 快指针走的路程为L+n*R+r,其中 R 为环的长度,n为圈数(对快指针走完的圈数未知);
- 由快指针走的路程是慢指针的两倍,建立式子有:2*(L+r) = L + n*R + r;
- 解得 L = n*R - r = (n-1) R + (R-r)
- 若指针cur从起始处开始走,慢指针从相遇处开始走,两者每次走一个节点
- 则慢指针经过时间 T 走完 (R-r) 路程后刚好到环入口
- 而指针cur 经过时间 T 后与环入口的距离为L - (R-r)
- 由上述式子可知 L - (R-r) = m*R
- 即该指针走完剩下的路程到达环入口之后,慢指针也刚好走了m圈回到了环入口
- 两者相遇,相遇节点为环入口