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(冲出了边界)
相关推荐
skywalker_113 小时前
力扣hot100-3(最长连续序列),4(移动零)
数据结构·算法·leetcode
6Hzlia3 小时前
【Hot 100 刷题计划】 LeetCode 17. 电话号码的字母组合 | C++ 回溯算法经典模板
c++·算法·leetcode
wfbcg3 小时前
每日算法练习:LeetCode 209. 长度最小的子数组 ✅
算法·leetcode·职场和发展
_日拱一卒3 小时前
LeetCode:除了自身以外数组的乘积
数据结构·算法·leetcode
计算机安禾4 小时前
【数据结构与算法】第36篇:排序大总结:稳定性、时间复杂度与适用场景
c语言·数据结构·c++·算法·链表·线性回归·visual studio
wsoz5 小时前
Leetcode普通数组-day5、6
c++·算法·leetcode·数组
y = xⁿ5 小时前
【LeetCode】双指针:同向快慢针
算法·leetcode
倦王5 小时前
力扣日刷47
算法·leetcode·职场和发展
Q741_1476 小时前
每日一题 力扣 3655. 区间乘法查询后的异或 II 模拟 分治 乘法差分法 快速幂 C++ 题解
c++·算法·leetcode·模拟·快速幂·分治·差分法
abant27 小时前
leetcode 239 单调队列 需要一些记忆
算法·leetcode·职场和发展