給定乙個鍊錶,判斷鍊錶中是否有環。
如果鍊錶中有某個節點,可以通過連續跟蹤 next 指標再次到達,則鍊錶中存在環。 為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置(索引從 0 開始)。 如果 pos 是 -1,則在該鍊錶中沒有環。注意:pos 不作為引數進行傳遞,僅僅是為了標識鍊錶的實際情況。
如果鍊錶中存在環,則返回 true 。 否則,返回 false 。
高階:你能用 o(1)(即,常量)記憶體解決此問題嗎?
示例 1:
輸入:head = [3,2,0,-4], pos = 1
輸出:true
解釋:鍊錶中有乙個環,其尾部連線到第二個節點。
示例 2:
輸入:head = [1,2], pos = 0
輸出:true
解釋:鍊錶中有乙個環,其尾部連線到第乙個節點。
示例 3:
輸入:head = [1], pos = -1
輸出:false
解釋:鍊錶中沒有環。
鍊錶中節點的數目範圍是 [0, 104]
-105 <= node.val <= 105
pos 為 -1 或者鍊錶中的乙個 有效索引 。
方法一:雜湊表
思路及演算法
最容易想到的方法是遍歷所有節點,每次遍歷到乙個節點時,判斷該節點此前是否被訪問過。
具體地,我們可以使用雜湊表來儲存所有已經訪問過的節點。每次我們到達乙個節點,如果該節點已經存在於雜湊表中,則說明該鍊錶是環形鍊錶,否則就將該節點加入雜湊表中。重複這一過程,直到我們遍歷完整個鍊錶即可。
public
class
solution
head = head.next;
}return
false;}
}
複雜度分析
時間複雜度:o(n)o(n),其中 nn 是鍊錶中的節點數。最壞情況下我們需要遍歷每個節點一次。
空間複雜度:o(n)o(n),其中 nn 是鍊錶中的節點數。主要為雜湊表的開銷,最壞情況下我們需要將每個節點插入到雜湊表中一次。
方法二:快慢指標
思路及演算法
本方法需要讀者對「floyd 判圈演算法」(又稱龜兔賽跑演算法)有所了解。
假想「烏龜」和「兔子」在鍊錶上移動,「兔子」跑得快,「烏龜」跑得慢。當「烏龜」和「兔子」從鍊錶上的同乙個節點開始移動時,如果該鍊錶中沒有環,那麼「兔子」將一直處於「烏龜」的前方;如果該鍊錶中有環,那麼「兔子」會先於「烏龜」進入環,並且一直在環內移動。等到「烏龜」進入環時,由於「兔子」的速度快,它一定會在某個時刻與烏龜相遇,即套了「烏龜」若干圈。
我們可以根據上述思路來解決本題。具體地,我們定義兩個指標,一快一滿。慢指標每次只移動一步,而快指標每次移動兩步。初始時,慢指標在位置 head,而快指標在位置 head.next。這樣一來,如果在移動的過程中,快指標反過來追上慢指標,就說明該鍊錶為環形鍊錶。否則快指標將到達鍊錶尾部,該煉表不為環形鍊錶。
細節為什麼我們要規定初始時慢指標在位置 head,快指標在位置 head.next,而不是兩個指標都在位置 head(即與「烏龜」和「兔子」中的敘述相同)?
觀察下面的**,我們使用的是 while 迴圈,迴圈條件先於迴圈體。由於迴圈條件一定是判斷快慢指標是否重合,如果我們將兩個指標初始都置於 head,那麼 while 迴圈就不會執行。因此,我們可以假想乙個在 head 之前的虛擬節點,慢指標從虛擬節點移動一步到達 head,快指標從虛擬節點移動兩步到達 head.next,這樣我們就可以使用 while 迴圈了。
當然,我們也可以使用 do-while 迴圈。此時,我們就可以把快慢指標的初始值都置為 head。
public
class
solution
listnode slow = head;
listnode fast = head.next;
while
(slow != fast)
slow = slow.next;
fast = fast.next.next;
}return
true;}
}
leetcode141 環形鍊錶
給定乙個鍊錶,判斷鍊錶中是否有環。高階 你能否不使用額外空間解決此題?思路 剛開始想著讓他迴圈下去,直到和頭結點相同的時候,就返回 true,否則就返回 false,但還是 too young too 實際上還是設定兩個指標,乙個快指標和乙個慢指標,只要是在環裡面,總會相遇的,就可 return t...
LeetCode141 環形鍊錶
題目描述 給定乙個鍊錶,判斷鍊錶中是否有環。高階 你能否不使用額外空間解決此題?演算法描述 1.使用兩個快慢指標遍歷鍊錶。slow每次走一步,fast每次走兩步。fast走到鍊錶尾部無環,slow與fast重疊則有環。2.若鍊錶的起始位置等於環的起始位置 slow走一圈回到起始位置,fast剛好走了...
LeetCode141環形鍊錶
給定乙個鍊錶,判斷鍊錶中是否有環。設定兩個指標,乙個fast乙個slow,遍歷整個列表,若達到表尾時仍未出現指標相等則鍊錶無環。c語言版 definition for singly linked list.struct listnode bool hascycle struct listnode h...