我们在前面文章中写过用快慢指针判断链表是否带环:
我们用的是slow指针一次走一步,fast指针一次走两步,当slow入环后开始了追击,每走一次距离缩短1,最终就会相遇
思考问题
但是我们思考一个问题:如果slow一次走一步,fast一次走三步,会不会相遇呢?
思考这个问题我们可以做一个假设:
假设环的长度是C,假设slow进环时,fast与slow之间的距离为N
推导思路
接着我们可以推一下:
如果slow一次走一步,fast一次走三步,每次追击距离缩小2
所以我们可以得出初步的结论:
- 如果N是偶数,就直接追上了
- 如果N是奇数,C是奇数,第一轮错过了,第二轮就追上了
- 如果N是奇数,C是偶数,就永远追不上
结论的第三条其实条件是不成立的,我们画图推一下:
所以这里我们就能得到一个结论
如果N是奇数,C是偶数,这个等式的条件是不成立的,所以不可能出第三种情况
结论
所以我们可以得出最终的结论:
- 如果N是偶数,就直接追上了
- 如果N是奇数,C是奇数,第一轮错过了,第二轮就追上了
- 不可能出现N是奇数,C是偶数的情况
所以如果slow一次走一步,fast一次走三步,一定能追上