链表中环的入口节点
给一个长度为n链表,若其中包含环,请找出该链表的环的入口结点,否则,返回null。
要求:空间复杂度 O(1),时间复杂度 O(n)
题解(双指针) :
- 慢指针走1,快指针走2,当快慢指针相遇时则代表链表中存在环
- 假设头节点位置:A,环头节点位置:B,快慢指针相遇节点位置:C
- 当慢指针到节点B时,距离相遇节点的距离为C,现假设快节点位置:D,则节点D->B的距离 === B->C的距离
- 所以当快慢节点相遇时 ,C->B的距离等于 A->B的距离 ,将快节点置为头节点
function EntryNodeOfLoop(pHead){
if(pHead==null || pHead.next==null ) return null
let solw=pHead,fast=pHead
while(solw.next.next){
slow=slow.next
fast=fast.next.next
if(slow==fast){
if(fast==pHead)return pHead
let solw2=pHead
while(solw2.next){
solw2=solw2.next
solw.next=solw.next
if(solw2==solw) return solw2
}
}
}
return null
}
\