LeetCode 142. 环形链表 II|Python 解法详解

LeetCode 142. 环形链表 II|Python 解法详解

CSDN 算法专题 · 链表 | 难度:中等

题目信息

题目描述

若链表有环,返回入环的第一个节点;无环返回 null,且不允许修改链表。

示例

text 复制代码
输入:head = [3,2,0,-4], pos = 1
输出:返回值为 2 的入环节点

约束

节点数不超过 10⁴。

解题思路

核心观察

快慢指针相遇后,根据距离关系,从头节点和相遇点各放一个同速指针,它们再次相遇的位置就是环入口。第一阶段同时也负责判定是否有环。

推导与执行步骤

  1. 快慢指针寻找首次相遇
  2. 若快指针到空则无环
  3. 一个指针回到 head
  4. 两个指针每次走一步,再次相遇即入口

为什么这个方法正确

算法始终围绕上述核心观察维护有效状态,并且每一步只排除已经能够证明不可能产生更优答案的情况。按照执行步骤处理后,所有可能影响答案的元素或节点都会被恰好检查,因此不会遗漏合法答案;状态更新又严格遵守题目约束,所以最终结果有效。

从边界看,空区间、单个元素、全部相同或完全不匹配等情况都会落入初始化条件或循环终止条件,不需要依赖未定义状态。实现时再重点检查下标、空节点和重复元素,即可保证算法在极端输入下仍然成立。

Python 代码

python 复制代码
# 解法核心:快慢指针相遇后,根据距离关系,从头节点和相遇点各放一个同速指针,它们再次相遇的位置就是环入口。第一阶段同时也负责判定是否有环。
# 实现步骤:
# 1. 快慢指针寻找首次相遇
# 2. 若快指针到空则无环
# 3. 一个指针回到 head
# 4. 两个指针每次走一步,再次相遇即入口

from typing import Optional

class ListNode:

    def __init__(self, x):
        self.val = x
        self.next = None

class Solution:

    def detectCycle(self, head: Optional[ListNode]) -> Optional[ListNode]:
        if not head:
            return None
        slow = fast = head  # 慢指针,通常指向已处理区域或链表中点
        while fast and fast.next:
            slow = slow.next  # 慢指针,通常指向已处理区域或链表中点
            fast = fast.next.next  # 快指针,用于扫描数据或定位链表中点
            if slow == fast:
                break
        if not fast or not fast.next:
            return None
        slow = head  # 慢指针,通常指向已处理区域或链表中点
        while slow != fast:
            slow = slow.next  # 慢指针,通常指向已处理区域或链表中点
            fast = fast.next  # 快指针,用于扫描数据或定位链表中点
        return slow

复杂度分析

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

易错点

第一阶段退出要区分"相遇"与"到达链尾"。

总结

这道题的关键是:快慢指针相遇后,根据距离关系,从头节点和相遇点各放一个同速指针,它们再次相遇的位置就是环入口。理解这一点后,再结合边界条件检查,代码就能保持清晰且稳定。

相关推荐
文丑颜不良啊6 小时前
LeetCode2481~2500题目解析
java·leetcode
用户956256254298 小时前
跟做:Firecrawl 单页转 Markdown 再丢进沙箱总结
python·api
威哥爱编程8 小时前
模拟面试智能体开发实战 02:回答等半分钟,谁还愿意练?把服务端和流式输出搭起来
python·agent·harmonyos
威哥爱编程8 小时前
模拟面试智能体开发实战 01:面试挂了都不知道挂在哪?用 Python 给自己造一个随叫随到的 AI 面试官
python·agent·harmonyos
2601_967980119 小时前
Python行情API量化 02:顺序拉 20 要 2 秒?并发批量把时间压到 0.5 秒
python·api·限流·并发·量化
伞伞悦读9 小时前
【第81期】特征缩放怎么选:标准化、MinMax 与 Robust 的原理、泄漏对照和完整实验
人工智能·python·深度学习·机器学习
新*9 小时前
从一段 WebSocket 代码聊开:bytes 不是 zlib、binaryType 决定一切,15MB 大消息的零拷贝优化
javascript·python·websocket·性能优化·blob·zlib·arraybuffer
卷无止境11 小时前
mathmodel-figure-templates 以及两个上手案例
后端·python
锋行天下12 小时前
服务器 Python 2.7 装不了 langgraph-cli?用本地生成 Dockerfile 曲线救国
人工智能·后端·python
一条大祥脚12 小时前
深入理解 PyTorch FlexAttention:从 Score Mod 到 Mask Mod 的稀疏加速之道
人工智能·pytorch·python·注意力机制·flex attention·可编程注意力