

解题思路:快慢指针
想象两个人在圆形操场上跑步:
慢指针(Slow): 每次走 1 步。
快指针(Fast): 每次走 2 步。
结论:
如果链表没有环,快指针会率先到达终点(指向 NULL)。
如果链表有环,快指针最终一定会从后面"追上"慢指针(两者指向同一个节点)。
时间复杂度O(N)O(N)O(N)
空间复杂度O(1)O(1)O(1)
python
# 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 not head or not head.next:
return False
fast = head
slow = head
# 如果没有环,快指针会率先到达终点(指向 NULL)
while fast and fast.next:
slow = slow.next
fast = fast.next.next
if slow == fast:
return True
return False
"同一个地址" vs "相同的值"
- slow == fast (判断节点对象/地址): 检查这两个指针是否指向内存中同一个物理位置。如果是同一个位置,说明快指针真的"绕回来"追上慢指针了。
- slow.val == fast.val (判断数值): 检查这两个节点里存的数字是否一样。
链表长度为奇数(如 3 个节点)
- fast 移动到 [3](最后一个节点)。此时:fast.next 是 NULL。循环结束
链表长度为偶数(如 4 个节点)
- fast 移动到 NULL(冲出了边界)