給定一個(gè)鏈表,判斷鏈表中是否有環(huán)。
為了表示給定鏈表中的環(huán),我們使用整數(shù) pos 來(lái)表示鏈表尾連接到鏈表中的位置(索引從 0 開(kāi)始)。 如果 pos 是 -1,則在該鏈表中沒(méi)有環(huán)。
示例 1:
輸入:head = [3,2,0,-4], pos = 1
輸出:true
解釋:鏈表中有一個(gè)環(huán),其尾部連接到第二個(gè)節(jié)點(diǎn)。
示例 2:
輸入:head = [1,2], pos = 0
輸出:true
解釋:鏈表中有一個(gè)環(huán),其尾部連接到第一個(gè)節(jié)點(diǎn)。
示例 3:
輸入:head = [1], pos = -1
輸出:false
解釋:鏈表中沒(méi)有環(huán)。
進(jìn)階
你能用 O(1)(即,常量)內(nèi)存解決此問(wèn)題嗎?
- show the code:
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
#### code1(hash)
class Solution(object):
def hasCycle(self, head):
"""
:type head: ListNode
:rtype: bool
"""
if not head:
return False
dic = {head}
while head:
head = head.next
if head not in dic:
dic.add(head)
else:
return True
return False
### code2(two pointers)
class Solution(object):
def hasCycle(self, head):
"""
:type head: ListNode
:rtype: bool
"""
if not head:
return False
slow = head
quick = head.next
while slow != quick:
if not quick or not quick.next:
return False
slow = slow.next
quick = quick.next.next
return True
- 此題有兩種方法:一種是建立一個(gè)集合來(lái)存儲(chǔ)先前遍歷過(guò)的節(jié)點(diǎn),也就是哈希法,如果之后出現(xiàn)重復(fù)的節(jié)點(diǎn),那么可以判斷鏈表中存在環(huán)(注意這里集合存儲(chǔ)的是節(jié)點(diǎn)內(nèi)存地址而不是節(jié)點(diǎn)值)
- 由于題目進(jìn)階版要求
的空間復(fù)雜度,所以哈希表肯定是不行的,不使用額外空間的話考慮使用快慢指針?lè)?,所謂的快慢指針就是指兩個(gè)指針,一個(gè)指針一次走一步即慢指針,一個(gè)一次走兩步即快指針,也是這種鏈表問(wèn)題的常見(jiàn)方法。我們知道如果鏈表中存在環(huán),那么快慢指針一定會(huì)相遇,至于什么時(shí)候相遇,我們可以近似認(rèn)為這取決于環(huán)的長(zhǎng)度。如果兩指針相遇,則說(shuō)明存在環(huán),如果遍歷到null,說(shuō)明不存在環(huán)。
- 有關(guān)時(shí)間和空間復(fù)雜度看官方題解分析:
-
復(fù)雜度分析
