力扣笔记——环形链表II

在做力扣环形链表找入环的第一个节点时,没有什么太好的思路,原题题号为142。看了解答之后,对于解答所提及的补充:为什么fast与slow第一次环中相遇一定是在slow的第一圈的时候?解答的图解不是很清晰,没看懂,自己琢磨了下,此处记录一下防止遗忘。

当slow指针第一次到达环形入口时,fast指针位于环形中任意位置,此时先假设fast在大于n/2处。此时fast要走完当前这圈的话,距离环形入口的距离为k,所以当slow走k/2距离时,fast会位于环形入口(因为fast指针速度是slow指针的两倍),即下图。

此时,slow还有n-k/2(分子只有k)的距离要走,即(2n-k)/2,即n/2+(n-k)/2,这个值会大于n/2因为k绝对是小于n的,意味着slow还有半圈以上的距离要走才能走完它的第一圈,但是当slow再走n/2的距离时,fast也会走n的距离,即fast从环形入口走完一圈又到了环形入口。这意味着slow还没走完它的第一圈的时候,fast已经追上了slow并且相遇了,所以第一次环中相遇一定是在slow的第一圈的时候。

这个时候假设的是当slow指针第一次到达环形入口时,fast在大于n/2处。如果在小于n/2处呢,其实也是一样的,同样意味着slow要走k/2距离时,fast会到达环形入口。此时,slow也即还有n-k/2(分子只有k)的距离要走,即(2n-k)/2,即n/2+(n-k)/2,即即使k无限逼近于n,slow要走的距离还是n/2+一个正数,大于n/2的也就和上面描述的k在n/2右边是一样的结果和结论。

当k=n时,即slow第一次到达环形入口时,fast也处在环形入口,slow移动n/2的距离后到达环的一半,fast从环形入口经过一圈又回到环形入口。

写的有点多,因为怕回过头来再看的时候再花时间。

经验分享 程序员 微信小程序 职场和发展