LeetCode題解 141 環形鍊錶

2022-03-14 15:42:41 字數 2182 閱讀 9928

目錄解法二:雙指標(龜兔演算法)

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

高階:

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

判斷乙個鍊錶是否包含環,可以轉化為判斷是否有乙個節點之前已經出現過。非常自然的乙個想法就是:遍歷鍊錶的每個節點,用乙個雜湊表記錄每個節點的引用(或記憶體位址);如果能夠遍歷到空節點,則此時已經遍歷到鍊錶的尾部,返回false;如果有乙個節點的引用出現在雜湊表中,則返回true

/**

* definition for singly-linked list.

* class listnode

* }*/public class solution

nodesseen.add(head);

head = head.next;

}return false;

}}

複雜度分析:

# definition for singly-linked list.

# class listnode(object):

# def __init__(self, x):

# self.val = x

# self.next = none

class solution(object):

def hascycle(self, head):

""":type head: listnode

:rtype: bool

"""nodes_seen = set()

while head is not none:

if head in nodes_seen:

return true

nodes_seen.add(head)

head = head.next

return false

複雜度分析同上。

另一種思路就是採用 floyd 的龜兔演算法,即借用兩個指標,乙個快指標和乙個慢指標,快指標每次移動兩個節點而慢指標則每次移動乙個節點。如果鍊錶中不存在環,則快指標會先於慢指標到達鍊錶的尾部,兩個指標永遠也不可能「相遇」;相反,如果鍊錶中存在環,則快指標一定會「追上」慢指標,就如同龜兔賽跑一樣,速度快的兔子一定會追上烏龜。

/**

* definition for singly-linked list.

* class listnode

* }*/public class solution

listnode slow = head;

listnode fast = head;

while (fast != null && fast.next != null)

}return false;

}}

複雜度分析:

# definition for singly-linked list.

# class listnode(object):

# def __init__(self, x):

# self.val = x

# self.next = none

class solution(object):

def hascycle(self, head):

""":type head: listnode

:rtype: bool

"""if head is none or head.next is none:

return false

slow, fast = head, head

while fast is not none and fast.next is not none:

slow, fast = slow.next, fast.next.next

if slow == fast:

return true

return false

# runtime: 44 ms

# your runtime beats 95.91 % of python submissions.

複雜度分析同上。

LeetCode題解 141 環形鍊錶

給定乙個鍊錶,判斷鍊錶中是否有環。高階 你能否不使用額外空間解決此題?輸入 1 no cycle,輸出false 輸入 1,2 no cycle,輸出false 輸入 3,0,2,4 tail connects to node index 1,輸出true.我們首先畫一下如果鍊錶存在環的情況,如下圖...

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 不作為引數進行傳遞,僅僅是為了標識...