LCH100之环形链表Ⅱ的思考

发布于 2025-01-23  110 次阅读


环形链表Ⅱ这题,此前没怎么细细想过,都是写一下过去了就行了,今天突然觉得有个地方想不通,最后搜索加推了一遍,自己想通了,特此记录一下

这题是这样写的

1.定义fast和slow,fast一次走两步,slow一次走一步

2.当fast == slow时,定义一个t节点为head,然后循环地t和slow 不断后走,t和slow相遇后,t就是这个链表的环的入口

可是为什么t和slow相遇后,就一定在环入口了呢?

假设链表分为两个部分:环部分(长度为b),非环部分(长度为a,从链表头到环入口的地方)

当第一次fast == slow时:慢指针走过a + x, 其中x是慢指针在环内走的长度

快指针走过a + x + nb,其中n标识快指针在环内多绕了n圈(可能为0)

由题2(a + x) = a + x + nb

化简得a + x = nb(快慢指针走得举例差是环长度得整数倍)

转化为a = nb - x (nb - x表示从相遇点回到环入口得举例)

这时候新指针t和slow同时走,他们相遇时所在的就是环入口

届ける言葉を今は育ててる
最后更新于 2025-01-23