鏈表中環的入口結點

題目描述

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

解法

快慢指針法
若假設有環存在,則快慢指針會交匯
若此時初始化一個指針從頭結點出發,則這個指針與慢指針交匯的結點爲環入口結點
此結論可通過畫圖證明:
假設進入環前的路程爲r1,交匯點與入口的距離爲r2,餘下距離爲r3.
則慢指針路程爲r1 + r2
快指針路程爲r1 + k(r2 + r3) + r2
然而慢指針速度是快指針的1/2
因此化簡因式 2(r1 + r2) = r1 + k(r2 + r3) + r2
r1 = (k - 1)r2 + k*r3 (k<=1) 且 r2 + r3爲環總長度
所以r1 = r3
詳細代碼如下:

/*
 public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}
*/
public class Solution {

    public ListNode EntryNodeOfLoop(ListNode pHead)
    {
        ListNode n1 = pHead;//slow
        ListNode n2 = pHead;//fast
        ListNode n3 = pHead;//result
        if(n1 == null||n1.next == null){
            return null;
        }
        while(n1 != null){
            n1 = n1.next;
            n2 = n2.next.next;
            if(n2 == n1){
                while(n1 != n3){
                    n1 = n1.next;
                    n3 = n3.next;
                }
                return n3;
            }
        }
        return null;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章