1.判断是否有环
当一个慢指针一次走一步,快指针一次走两步,假设两个指针在慢指针进环时之间的距离为N,那么因为他们之间的步长差为1,再快指针追赶一定次数次数后,就能够实现相遇。
2.如果快指针一次走三步呢?
也是没有关系的,首先要把这种分为两种情况讨论,
1:走三步则间距是2了嘛,当慢指针开始进环时相差为奇数的时候,就会出现套圈,这时候距离就变为了C-1,如果C-1为偶数,那就会相遇;
2:但是C-1为奇数就不会套圈,既C为偶数;
设慢指针指针刚入圈时,快指针需要走N才能追上,头到起点的距离为L,环长为C;
让我们计算一下可能进入的圈内的情况,
快指针走过的路线长度为 L+nC+(C-N)
慢指针走过的路线长度为 L
3L= L+nC+(C-N) -> 2L=(n+1)C-N,因为2*L一定为偶数,所以后面这两项为偶偶或者奇奇;
于是可以知道C和N为偶偶或者奇奇,那么当步数为3的时候,步差为2,当N为奇数的时候会套圈,这时就看C-1是不是偶数,也就是C是不是奇数,当C是偶数的时候就会遇不上,但是由上述已经知道必为奇数,也就是必定遇见。(至于其它情况则需要进行类似的推导,如果没有限制到那就有可能相遇不了)
3.如何求解环的起始点?
L为慢指针刚进入环所走过的距离
在快指针为2步的情况下
(L+N)为慢指针与快指针相遇所需要走的路程
L+nC+(C-N)为慢指针刚进环的时候快指针已经走过的距离
2N为快指针为了追上慢指针所需要走的距离
由二中的式子可以得到相遇时快指针所走过的路程为 L+nC+(C-N)+2N
既 L+(n+1)C+N
也就是说在他在环起点的N处
同理二可以推导出 :2L= L+nC+(C-N) -> L=(n+1)C-N=nC+(C-N)
那么是不是就可以得到相遇点和头指针开始一人走一步,他们会在起点处相遇,因为现在相遇点在N处,再走(C-N)就会回到环的起点,而这部分距离刚好和L的(C-N)抵消了,从起点到环的距离是不是就只剩下环的周长了,所以说会在起点处相遇。
所以得到思路:
先寻找相遇点,再让head头指针和相遇点的指针每次走1步,相遇时head指针就是环起始点,注意点:是每个指针走一步,不再是快指针两步