LeetCode題解:142.環形鏈表II

設計鏈表

一、LeetCode題解

瞧一瞧~

二、算法題

題目

給定一個鏈表,返回鏈表開始入環的第一個節點。 如果鏈表無環,則返回 null。如果有環,則確定它的入口位置。

思路
  • 第一階段,我們先確定當前鏈表是否存在環
  • 第二階段,如果存在環,我們要確定入口的位置
    • 入口前節點個數爲a,環節點個數爲b
    • 快節點走過的節點數 = 2 * 慢節點走過的節點數,即 f = 2s
    • 快節點走過的節點數 = s + nb(多揍了n倍的環)(相遇時);
    • 由此得出:s = nb(相遇時);
    • 如果說慢指針走到入口的距離 k = a + nb,兩點相遇時s = nb,即再走a步即可;
    • 我們重新確定雙指針(速度要相同),新指針走 a 步應該到達入口,慢指針走a步也會到達入口;
    • 新指針推斷爲 頭節點,兩者相遇的節點爲入口;
代碼
var detectCycle = function(head) {
    var slow = head, fast = head;
    while(fast && fast.next) {
        // 如果 快指針 走到終點,證明無環
        slow = slow.next;
        fast = fast.next.next;
        if (fast === slow) {
            // 記錄相遇點
            // 新指針在起點,快指針在相遇點
            // 兩個節點再次相遇時,一定在入口點
            var start = head;
            while (start !== fast) {
                start = start.next;
                fast = fast.next;
            }
            return fast;
        }
    }
    return null;
};
結果

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章