快慢指针和万恶的数学推理
- 快指针fast比慢指针slow多走两步,如果有环fast会追上slow,它们一定会相遇,同时它们相遇了说明在环内。此为第一次相遇。
- 假设头结点到入环口有a个结点(不包括环的第一个结点),环的结点数为b。相遇时fast走的路程为2nb,slow走的路程为nb,n是fast比slow多走的圈数,证明过程如下。且慢指针再走a就能到达入环口,证明过程如下。
1
2
3
4
5
6
7
8//证明1
1. 首先,fast走的路是slow路程的两倍,即f=2s;
2. 其次,第一次相遇时fast比slow多走了n个环的路程,即f=s+nb;
3. 联立上述两式,可解得:f=2nb,s=nb。
//证明2
1. 走到入环口的路程公式是:k=a+nb;
2. 目前slow走了nb,再走a就能走到入环口。 - 而head到入环口的距离刚好就是a,但是问题是a的值是未知的,所以需要用一个指针指向head(这里就用原来的快指针),一步一步地走来计数,同时慢指针也一步一步走,当它们相等时为第二次相遇,此时刚好走了a步。所以也就是说该指针具有如下性质:它和慢指针一起走a步后它们俩可以再入环口相遇
代码如下:
1 | class Solution { |