📅  最后修改于: 2023-12-03 15:26:09.126000             🧑  作者: Mango
如何判断一个链表是否有环?如果有环,如何找到环的起点?
使用哈希表来记录每个节点是否被访问过,如果一个节点被访问过两次,则说明链表有环。时间复杂度为 O(n),空间复杂度为 O(n)。
class Solution:
def hasCycle(self, head: ListNode) -> bool:
node_set = set()
while head:
if head in node_set:
return True
node_set.add(head)
head = head.next
return False
使用两个指针,一个指针每次向前移动一个节点,另一个指针每次向前移动两个节点。如果链表有环,则两个指针会在某一时刻相遇。时间复杂度为 O(n),空间复杂度为 O(1)。
class Solution:
def detectCycle(self, head: ListNode) -> ListNode:
slow = fast = head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
if slow == fast:
break
else:
return None
slow = head
while slow != fast:
slow = slow.next
fast = fast.next
return slow
判断链表是否有环是链表问题中的一个经典问题,掌握上述两种解法可以很好地应对这类问题。使用哈希表相对简单,但会使用更多的内存;快慢指针需要像数学证明一样理解才能防止出错,但空间复杂度比哈希表要低。