判断链表里是否带环,我们无法用正常的链表遍历得出
这里使用的算法思想是前后指针
首先我们让slow和fast位于链表头部,slow每次遍历一个,fast每次遍历两个,当slow进入循环点时,fast已经在循环里面。
此时就是典型的追击问题,fast与slow之间的速度差为1,当fast=slow时,链表带环;
那么我们只需考虑循环条件是什么,我们发现,链表带环时,是没有指向null的,因此我们只需要
那么 slow一次走一步,fast走3,4,5...n步,请证明一定能追上吗;
首先我们来看fast走3步的情况
假设环的长度为L;
当slow进环之后,假设slow与fast之间 距离为S,slow与fast之间的速度差为2;
因此,当S为偶数的时候,一定能追上;
当S为奇数时,无法追上,每次S -= 2;当S= -1时,此时S=L-1;(错过了,开启了新的一轮追击)
当L-1为偶数时,可以追上;
当L-1为奇数时,则永远无法追上;
总结:S为偶数 -> 第一轮就追上;
S为奇数 -> L-1为偶数 -> 第二轮追上;
S为奇数 -> L-1为奇数 -> 永远追不上;
当slow刚进入循环时,fast走的距离是slow的三倍;
因此我们可以列出关系式

我们可以看到,等式左边2C一定是偶数(x表示fast循环了x轮)
根据上述总结,当 S为奇数,L-1为奇数时永远追不上;
带入等式右边,L为偶数(x+1)*L为偶数,S为奇数,偶数-奇数=奇数,
等式左右不成立,所以S为奇数和(L-1)为奇数不能同时存在
真正的总结:根据上次总结得知S为奇数,L-1为奇数时永远不可能追上,但是S和L-1不可能同时为奇数,因此一定能追上
S为偶数 -> 第一轮追上;
S为奇数 -> 第二轮追上;
976

被折叠的 条评论
为什么被折叠?



