带环单链表+带环单链表
-
判断相交
若共用一个环则相交,若不共用则不相交
-求解相交点
判断是否带环
定义快慢指针,快指针一次走两步,慢指针一次走一步;
若快指针走完,慢指针走到一半(奇数为中间的节点,偶数为中间的两个中的后一个节点)则无环。
若有环,快指针必定先入环,当快指针在环中走n圈时(n = 0,1,2,3…)慢指针入环,由于快指针一次走二步慢指针走一步,在环中慢指针与快指针距离总减少一步,减少一个节点,当慢指针还未走完一圈时,快指针追上慢指针,两者相等,则必定有环。
求带环指针的入口节点
设链表头为PH ,快慢指针相遇处为PM,链表环入口点为i点;
设x到指针口距离为L,快慢指针相遇出距离带环指针入口节点距离为X,环的周长为R;
快指针走的步数:L+X+nR;(n=1,2,3,4…)(快指针追上慢指针最少走一圈);
慢指针走的步数:L+X;
由于 快指针的步数 == 2✖慢指针的步数
所以 2(L+X) ==L+X+nR
所以L == nR-X
当n = 1 时 ,L== R-X;
当n = 2 时 ,L==R+(R-X)
…
当链表头指针PH从头一次走一步走到环指针的入口节点处时,快慢指针相遇点PM(求快慢指针相遇点时必须快指针走二步慢指针走一步)刚好也一次走一步走到环指针入口节点处,
所以当PM=PH此节点就是入口点;
当带环单链表与带环单链表不相交
带环链表一的快慢指针相遇点与带环指针二的快慢指针相遇点没在同一个环中;
判断方法:
将一个环的相遇点绕环一周判断是否出现与另一个环相遇点(快慢指针的交点)相同的节点,若不出现则不相交若出现则相交。
当带环单链表与带环单链表相交
1.环外相交
2.环内相交环外相交
用快慢指针判断出带环
法一将快慢指针相遇点当作这两个链表的结束点,判断链表一二长度,将长链表向前移动差值位,在将短链表从头移动,长链表从移动了差值位处移动,从当前位置开始检测,两个链表的节点是否相同,相同此节点位相交点,不同两链表各自向下移动一步继续检测;
法二将链表一的快慢指针相遇点与链表一头部相连,则链表一成完整一个环,新链表二的入口点即为环外相交的交点
求出交点再使链表一快慢指针相遇点☞指回快链表一慢指针相遇点的下一个节点。
环内相交
则有两个交点
交点即为带环单链表一和带环单链表二的带环入口点,求出即可;