leetcode hot100 环形链表 easy 快慢指针


解题思路:快慢指针

想象两个人在圆形操场上跑步:

慢指针(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(冲出了边界)
相关推荐
jieyucx8 小时前
Go 零基础数据结构:链表的增删改查(像串珠子一样简单)
数据结构·链表·golang
We་ct13 小时前
LeetCode 5. 最长回文子串:DP + 中心扩展
前端·javascript·算法·leetcode·typescript
leoufung19 小时前
LeetCode 149: Max Points on a Line - 解题思路详解
算法·leetcode·职场和发展
样例过了就是过了19 小时前
LeetCode热题100 最长公共子序列
c++·算法·leetcode·动态规划
MegaDataFlowers21 小时前
206.反转链表
数据结构·链表
样例过了就是过了1 天前
LeetCode热题 不同路径
c++·算法·leetcode·动态规划
Navigator_Z1 天前
LeetCode //C - 1031. Maximum Sum of Two Non-Overlapping Subarrays
c语言·算法·leetcode
xieliyu.1 天前
Java手搓数据结构:从零模拟实现无头双向非循环链表
java·数据结构·链表
如何原谅奋力过但无声1 天前
【灵神高频面试题合集01-03】相向双指针、滑动窗口
数据结构·python·算法·leetcode
leoufung1 天前
LeetCode 42:接雨水 —— 从“矩形法”到双指针的完整思考过程
java·算法·leetcode