环形链表Ⅱ这题,此前没怎么细细想过,都是写一下过去了就行了,今天突然觉得有个地方想不通,最后搜索加推了一遍,自己想通了,特此记录一下
这题是这样写的
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同时走,他们相遇时所在的就是环入口
Comments NOTHING