环形链表相关问题
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是(n-1)圈再加上相遇点走回起始点,所以得到思路:
先寻找相遇点,再让head头指针和相遇点的指针每次走1步,相遇时head指针就是环起始点,注意点:是每个指针走一步,不再是快指针两步