LeetCode141——環形鏈表

題目描述

方法一:硬破解

循環一定次數,或者循環一定的時間,還沒有出來的就是進入到環裏了,至於循環幾次或者循環多久,有空的朋友可以慢慢調這個參數。🙂🙂🙂

/**
 * @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)

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