链表中环的入口节点

308 阅读1分钟

链表中环的入口节点

给一个长度为n链表,若其中包含环,请找出该链表的环的入口结点,否则,返回null。

要求:空间复杂度 O(1),时间复杂度 O(n)

题解(双指针) :

  1. 慢指针走1,快指针走2,当快慢指针相遇时则代表链表中存在环
  2. 假设头节点位置:A,环头节点位置:B,快慢指针相遇节点位置:C
  3. 当慢指针到节点B时,距离相遇节点的距离为C,现假设快节点位置:D,则节点D->B的距离 === B->C的距离
  4. 所以当快慢节点相遇时 ,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
}

\