更優解法
要識別環就要識別出哪些節點是會被重複遍歷的,找到第一次被重複遍歷的節點就是本題的答案,因此需要對已經遍歷過的節點進行標記,在迴圈過程中進行判定,但是節點屬性裡並不能新增標識位,而且因為鍊錶的特性當前節點只能獲取其後面的值,前面遍歷過的就被遺忘了。
到這裡,聯想到了額外設定乙個指標用於指向前面被遍歷過的節點,於是獲得了解題思路。
設定乙個初始指標1,指向第乙個節點,然後從這裡開始遍歷(設定遍歷指標2),遍歷過程中判斷是否有節點指回該節點,有則輸出指標1,沒有則將指標1後移
迴圈上述過程
編碼過程中發現問題就是,假如真的有環存在,遍歷終止的條件怎麼設定呢?或者說怎麼找到環?
這就陷入了迴圈需求,所以最後我自己沒有找到解法。
判斷鍊錶是否有環?
可以使用快慢指標法, 分別定義 fast 和 slow指標,從頭結點出發,fast指標每次移動兩個節點,slow指標每次移動乙個節點,如果 fast 和 slow指標在途中相遇 ,說明這個鍊錶有環。為什麼fast 走兩個節點,slow走乙個節點,有環的話,一定會在環內相遇呢,而不是永遠的錯開呢首先第一點:fast指標一定先進入環中,如果fast 指標和slow指標相遇的話,一定是在環中相遇,這是毋庸置疑的。
這是因為fast是走兩步,slow是走一步,其實相對於slow來說,fast是乙個節點乙個節點的靠近slow的,所以fast一定可以和slow重合。
如果有環,如何找到這個環的入口?
(省略數學論證的過程…)結論是
從頭結點出發乙個指標,從相遇節點 也出發乙個指標,這兩個指標每次只走乙個節點, 那麼當這兩個指標相遇的時候就是 環形入口的節點
知道了這兩點,編碼實現就很簡單了。
public
class
solution
return index2;
// 返回環的入口}}
return
null;}
}
時間複雜度:o(n) 結束時慢指標剛好走過一遍所有節點
空間複雜度:o(1) 雙指標使用常數大小的額外空間
LeetCode 第142題環形鍊錶 II
題目描述 給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。如果鍊錶無環,則返回 null。為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置 索引從 0 開始 如果 pos 是 1,則在該鍊錶中沒有環。解題思路 1 分兩步,第一步 用快慢指標,相遇後,判斷慢指標位於頭指標位置,...
力扣第142題環形鍊錶II
142.環形鍊錶ii 難度 中等 標籤 雙指標 給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。如果鍊錶無環,則返回 null。為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置 索引從 0 開始 如果 pos 是 1,則在該鍊錶中沒有環。說明 不允許修改給定的鍊錶。示例 1 ...
LeetCode演算法題142 環形鍊錶 II解析
給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。如果鍊錶無環,則返回 null。為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置 索引從 0 開始 如果 pos 是 1,則在該鍊錶中沒有環。說明 不允許修改給定的鍊錶。示例 1 輸入 head 3,2,0,4 pos 1 輸出...