給定一個鏈表,判斷鏈表中是否有環。3d
爲了表示給定鏈表中的環,咱們使用整數 pos 來表示鏈表尾鏈接到鏈表中的位置(索引從 0 開始)。 若是 pos 是 -1,則在該鏈表中沒有環。指針
示例 1:code
輸入:head = [3,2,0,-4], pos = 1 輸出:true 解釋:鏈表中有一個環,其尾部鏈接到第二個節點。
示例 2:blog
輸入:head = [1,2], pos = 0 輸出:true 解釋:鏈表中有一個環,其尾部鏈接到第一個節點。
示例 3:索引
輸入:head = [1], pos = -1 輸出:false 解釋:鏈表中沒有環。
進階:你能用 O(1)(即,常量)內存解決此問題嗎?內存
三種方法:
1,遍歷整個鏈表,看能不能走到尾部NULL,若是有NULL則無環,若是沒有NULL就多是有環,也可能鏈表太長會運行超時,這種方法不可取
2,用哈希表,依次遍歷鏈表set存儲走過的點 ———— 時間複雜度O(n),空間複雜度O(n)
3,快慢指針,若是有環快指針必定會追上慢指針,二者相遇即有環,快指針走到NULL即無環 ———— 時間複雜度O(n),空間複雜度O(1)it
經過代碼以下:io
# Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None ## 哈希set,對比走過的點 class Solution: def hasCycle(self, head: ListNode) -> bool: s = set() while head: if head in s: return True s.add(head) head = head.next return False ## 時間複雜度O(n),空間複雜度O(n) ## 快慢指針,快指針一次走兩步,慢指針走一步,若是有環快慢必定會相遇 # class Solution: # def hasCycle(self, head: ListNode) -> bool: # f = s = head # while f and f.next: # 必定是f.next不能爲空,由於f走得快 # f = f.next.next # s = s.next # if f == s: # return True # return False ## 時間複雜度O(n),空間複雜度O(1)