链表三连

一、如何找到两个链表的交点

两个链表有以下3种情况:
(1)相交


(2)平行


(3)属于


其中链表A、B长度未知
可以设链表A到相交节点长度为,链表B到相交节点长度为。对于特殊情况(2),分别为链表A、B长度;对于特殊情况(3)。
如果将链表AB连接,所得到的链表AB和链表BA长度必然相等。
若设链表A、B公共节点长度为s,公共节点为C,C在AB中出现的位置有。在BA中出现的位置有。因此,令指针先遍历A再遍历B,指针先遍历B再遍历A,则两个指针必定在交点相遇。

二、如何判断链表中是否有环

可以使用快慢指针。假设B以A两倍速度绕操场跑步,那么B最终一定会追上A。判断有环也是同理。
假设链表L到环的起点长度为x,环的长度为m,环起点为T。
慢指针slow每次前进一步,快指针fast每次前进两步。则当slow到达环的起点时,fast在环中前进了x步。距离再次回到T长度为(m-x%m)。
此时,等同于fast落后slow指针(m-x%m)步。已知fast速度是slow两倍。可得fast和slow必定在节点T后(m-x%m)步相遇。
可得,若快慢指针相遇,则有环;否则,没有环。

三、找到环的起始节点

由二可得,fast和slow必定在节点T后(m-x%m)步相遇。
m-x%m=m-(x-nm)=(n+1)m-x
即还差x步可以绕环走n+1圈。
那么在找到相遇节点后,令另一个指针start从起始节点出发,与slow指针同步前进,走x步后正好与slow指针在环起始节点相遇。

你可能感兴趣的:(链表三连)