劍指Offer55 鏈表環入口(鏈表多指針遍歷)

給一個鏈表,若其中包含環,請找出該鏈表的環的入口結點,否則,輸出null。

8923455-2ac73365bc4a95cd.png
帶有環的鏈表.png
  1. 設置兩個指針,快指針每次走兩步,慢指針每次走一步
  2. 兩個指針同時走,直到相遇
  3. 記錄相遇點爲B
  4. 設置兩個指針,一個從A出發,一個從B出發,必定在C相遇!

爲啥呢????

  1. 當在B相遇的時候,快指針比慢指針多走了N個環
  2. 快指針還差BC長度就走了 AC + M個環
  3. 所以BC = AC + S個環
  4. 從A和B同時出發的兩個速度相同的指針點顯然在C(仔細琢磨爲啥)

牛客網

    public ListNode EntryNodeOfLoop(ListNode pHead)
    {
         if(pHead==null||pHead.next==null)return null;
         ListNode p1=pHead;
         ListNode p2=pHead;
        while(p2!=null&&p2.next!=null)
         {
            p1=p1.next;
            p2=p2.next.next;
            if(p1==p2)
            {
                p1=pHead;
                while(p1!=p2)
                {
                    p1=p1.next;
                    p2=p2.next;
                }
                if(p1==p2)return p1;
            }
        }
        return null;
    }
發佈了41 篇原創文章 · 獲贊 11 · 訪問量 7125
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章