链表题解——环形链表 II【LeetCode】

142. 环形链表 II

快慢指针法

  • 核心思想

    1. 快慢指针
      • 使用快慢指针(fastslow)遍历链表。
      • 快指针每次移动两步,慢指针每次移动一步。
      • 如果链表存在环,快指针最终会追上慢指针(相遇)。
    2. 找到环的入口
      • 当快慢指针相遇时,初始化一个新指针 ptr,指向链表头节点。
      • 同时移动 ptrslow,每次移动一步,直到它们相遇。
      • 相遇的节点就是环的入口节点。

上面思路和图解来自灵茶山艾府

  • 时间复杂度

    • 最坏情况下需要遍历整个链表,时间复杂度为 O(n),其中 n 是链表的节点数。
  • 空间复杂度

    • 只使用了常数级别的额外空间,空间复杂度为 O(1)
python 复制代码
class Solution:
    def detectCycle(self, head):
    slow = fast = head  # 初始化慢指针和快指针,都指向链表头节点
    while fast is not None:  # 当快指针不为空时
        slow = slow.next  # 慢指针每次移动一步
        if fast.next is None:  # 如果快指针的下一个节点为空
            return None  # 说明链表没有环,返回 None
        fast = fast.next.next  # 快指针每次移动两步
        if fast == slow:  # 如果快慢指针相遇
            ptr = head  # 初始化一个新指针,指向链表头节点
            while ptr != slow:  # 当新指针和慢指针不相遇时
                ptr = ptr.next  # 新指针每次移动一步
                slow = slow.next  # 慢指针每次移动一步
            return ptr  # 返回新指针指向的节点(即环的入口节点)
    return None  # 遍历结束,没有发现环,返回 None
相关推荐
火车叨位去194926 分钟前
力扣top100(day04-05)--堆
算法·leetcode·职场和发展
Miraitowa_cheems1 小时前
LeetCode算法日记 - Day 11: 寻找峰值、山脉数组的峰顶索引
java·算法·leetcode
指针满天飞1 小时前
Collections.synchronizedList是如何将List变为线程安全的
java·数据结构·list
洋曼巴-young2 小时前
240. 搜索二维矩阵 II
数据结构·算法·矩阵
楼田莉子3 小时前
C++算法题目分享:二叉搜索树相关的习题
数据结构·c++·学习·算法·leetcode·面试
小明的小名叫小明4 小时前
区块链技术原理(14)-以太坊数据结构
数据结构·区块链
pusue_the_sun4 小时前
数据结构——栈和队列oj练习
c语言·数据结构·算法··队列
奶黄小甜包5 小时前
C语言零基础第18讲:自定义类型—结构体
c语言·数据结构·笔记·学习
想不明白的过度思考者5 小时前
数据结构(排序篇)——七大排序算法奇幻之旅:从扑克牌到百亿数据的魔法整理术
数据结构·算法·排序算法
一支闲人5 小时前
C语言相关简单数据结构:双向链表
c语言·数据结构·链表·基础知识·适用于新手小白