LeetCode題解 141 環形鍊錶

2021-08-21 10:30:02 字數 1358 閱讀 8943

給定乙個鍊錶,判斷鍊錶中是否有環。

高階:

你能否不使用額外空間解決此題?

輸入:[1] no cycle,輸出false;

輸入:[1,2] no cycle,輸出false;

輸入:[3,0,-2,4] tail connects to node index 1, 輸出true.

我們首先畫一下如果鍊錶存在環的情況,如下圖所示。

如果鍊錶存在環,那麼這個鍊錶一定從某乙個節點開始會出現環的入口,最後,遍歷經過一圈之後還會回到入口處。題目要求檢查是否存在環,那麼最直接的方法是檢查遍歷鍊錶的過程中是否出現某乙個節點被遍歷了兩次。

以上面的圖為例,從節點3進入後經過4,5,6,7,8後仍然會回到節點3,那麼這個時候就節點3被遍歷了兩次,那麼就很容易想到第一種雜湊表法

使用乙個指標遍歷鍊錶,每次訪問乙個節點首先都判斷hashset中是否存在同乙個節點,如果存在則鍊錶存在環,否則持續加入到hashset中。當指標遍歷到null的時候仍然沒有找到環,證明鍊錶不存在環。

上面的雜湊表法很容易構思,但是不滿足高階要求中的空間複雜度是o(1)的條件,那麼則構思出第二種方法雙指標法

雙指標在鍊錶的操作中比較常見,應該作為一種常用的思路記住。還以上面的圖為例,我們設定兩個指標從head開始遍歷,規定兩個指標的前進速度不一樣,分別稱為快、慢指標,如下圖所示,slow指標每次前進乙個,fast指標每次前進兩個節點。

因為fast指標每次前進兩個,一定比slow指標先到達環的入口處。而當slow指標進入環的時候,fast指標已經經過了兩個節點,如下圖所示。這個時候,我們將這個過程想象成400m跑步的追及問題。如果存在環的話,因為fast指標速度更快,一定會追上slow指標。而如果fast指標沒有追上slow指標,一定是因為鍊錶不存在環。

特殊情況1:空鍊錶不成環;

特殊情況2:單節點不自成環。

LeetCode題解 141 環形鍊錶

目錄解法二 雙指標 龜兔演算法 給定乙個鍊錶,判斷鍊錶中是否有環。高階 你能否不使用額外空間解決此題?判斷乙個鍊錶是否包含環,可以轉化為判斷是否有乙個節點之前已經出現過。非常自然的乙個想法就是 遍歷鍊錶的每個節點,用乙個雜湊表記錄每個節點的引用 或記憶體位址 如果能夠遍歷到空節點,則此時已經遍歷到鍊...

LeetCode演算法題解 141 環形鍊錶

題目描述 題解 看 definition for singly linked list.struct listnode class solution else else head head next return false set node while head node.insert head ...

141 環形鍊錶 LeetCode

給定乙個鍊錶,判斷鍊錶中是否有環。如果鍊錶中有某個節點,可以通過連續跟蹤 next 指標再次到達,則鍊錶中存在環。為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置 索引從 0 開始 如果 pos 是 1,則在該鍊錶中沒有環。注意 pos 不作為引數進行傳遞,僅僅是為了標識...