【Leetcode鏈表】環形鏈表(141)

題目

給定一個鏈表,判斷鏈表中是否有環。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)
相關文章
相關標籤/搜索