目錄解法二:雙指標(龜兔演算法)
給定乙個鍊錶,判斷鍊錶中是否有環。
高階:
你能否不使用額外空間解決此題?
判斷乙個鍊錶是否包含環,可以轉化為判斷是否有乙個節點之前已經出現過。非常自然的乙個想法就是:遍歷鍊錶的每個節點,用乙個雜湊表記錄每個節點的引用(或記憶體位址);如果能夠遍歷到空節點,則此時已經遍歷到鍊錶的尾部,返回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 不作為引數進行傳遞,僅僅是為了標識...