【力扣100】141.环形链表

添加链接描述

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def hasCycle(self, head: Optional[ListNode]) -> bool:
        # 思路是快慢指针,如果有环的话,快指针会遇上慢指针
        if head is None:
            return False
        slow=head
        fast=head
        while fast.next and fast.next.next:
            slow=slow.next
            fast=fast.next.next
            if slow ==fast:
                return True
        return False
        

思路:

  1. 使用快慢指针,如果存在环形,那么快慢指针会相遇


set解法

  1. 使用set,将每个节点加入set,如果这个节点在set中出现了,那么这个链表存在环形节点
def hasCycle(head):
    visited = set()
    while head:
        if head in visited:
            return True
        visited.add(head)
        head = head.next
    return False

在Python中,if head in visited 这种查询操作对于集合(set)的时间复杂度是平均情况下近似为 O(1)。这是因为集合使用了哈希表(hash table)来存储元素,哈希表可以在常数时间内(平均情况下)完成查找操作。在最糟糕的情况下,查询可能需要 O(n) 的时间,但这种情况非常罕见,通常情况下集合的查询时间复杂度是 O(1)。



思路三:修改链表值的解法:

  1. 将访问过的链表都变成一个特定的值
  2. 再次访问到这个值时,证明有环形存在
def hasCycle(head):
    marker = float('inf')  # 可以是任何特殊值
    while head:
        if head.val == marker:
            return True
        head.val = marker
        head = head.next
    return False

你可能感兴趣的:(leetcode,链表,算法)