解决一个问题,需要严谨的数学逻辑以及思维的推理过程 ,我们今天分享的 环形链表中的环判断(快慢指针版)就能感受到其中的思维美。
什么事带环的链表,简单来说就是成一个循环的链表,但又不是双向链表,如图。
ok,相信你已经有了比较清晰的认识。u那你如何解呢?
误区:一般人会想着去求链表的长度,注意一旦带环我们就求不出其长度,你可以想链表无限循环下去,它的长度是无穷。
本题要运用的方法就是双指针法,也就是追及问题
如图,我们设立快慢指针,让slow走一步,fast走二步。
有些小伙伴问为什么不让slow,fast随便走,只要fast比slow快就行
其实,这个问题可以通过推理验证!,我们先以
1,slow走一步,fast走二步为例。fast先进环,过一会,slow也进环,假设此时slow与fast之间距离为N,则每追一次,距离减少一,那当距离为0时,则追上了。
2,slow走1步,fast走3步,则每追击一次,距离减少2;我们要分奇偶数讨论,当N为偶数时,为0时追上了,当N为奇数时,就为-1了,我们设环度为C,-1意味着他们之间的距变成了C-1,进入了新一轮循环;
3,那在这种情况下,如果c-1为偶数时,则fast还可以追上slow, 但是 c-1为奇数时,则fast不可以追上slow,因为他们之间的距离一直为c-1,一直是死循环。所以,永远追不上的条件为N是奇数并且C-1也为奇数;所以也不是随便走
4,但是我们再从链表头到入口点进行推断,有slow走的距离:L;有fast走的距离为L+(n+1)*c-N
所以有3L=L+(n+1)*c-N,即2L=(n+1)*c-N,左边为偶数,所以根据等式二边奇偶性一样,我们不难推出N是奇数并且C-1也为奇数并不能共存!
5,所以,永远追不上的条件并不存在!;
已知:1,我们先设链表的头head到环的入口点的距离为L,环的长度为c,环的入口点到遇点为t
2,slow与fast相遇不会出环,因为slow如果出环等于,slow走了一个c,那fast走了二个c,所以一定会相遇在环中
3,设立快慢指针,让slow走一步,fast走二步
图解:
推理:
1, 对于slow:走的距离为 L+t ,那么对于fast则为slow二倍2(L+t),fast也可以为L+n*c+t;
注意:为n*c,因为可能环的长度要远远小于L的长度,那么fast已经在环中走了好几圈;如图:
所以有等式2(L+t)==L+n*c+t;(n>=1)
解得:L=n*c-t=(n-1)*c+c-t;
2,一个指针从链表头head走,一个指针从相遇点走,他们会在环的入口点相遇(重点)
最后以缘分结尾,愿大家都能找到与你有缘分的那一个人!最后,你了解了原理,代码不是轻轻松松!