題目描述
方法一:硬破解
循環一定次數,或者循環一定的時間,還沒有出來的就是進入到環裏了,至於循環幾次或者循環多久,有空的朋友可以慢慢調這個參數。🙂🙂🙂
/**
* @param {ListNode} head
* @return {boolean}
*/
var hasCycle = function(head) {
let now = head
let t = 0
while(now) {
if (t > 10000) return true
now = now.next
t += 1
}
return false
};
方法二:哈希表
我們可以用一個 set
存下之前訪問過的節點,如果再次訪問了這個節點,則有環。
/**
* @param {ListNode} head
* @return {boolean}
*/
var hasCycle = function(head) {
const set = new Set()
let now = head
while(now) {
if (set.has(now)) return true
set.add(now)
now = now.next
}
return false
};
時間複雜度:O(n)
空間複製讀:O(n)
方法三:龜兔賽跑
有兩個指針,一個快指針,一個慢指針,快指針一次走兩步,慢指針一次走一步。如果鏈表有環,則兩個指針最終將會相遇。如果沒有環,則永遠不會相遇。
/**
* @param {ListNode} head
* @return {boolean}
*/
var hasCycle = function(head) {
let fast = slow = head
while(fast && slow && fast.next) {
fast = fast.next.next
slow = slow.next
if (fast === slow) return true
}
return false
};
時間複雜度:O(n)
空間複雜度:O(1)