【力扣-141. 环形链表 ✨】Python笔记

职场如链表:如何发现那个"走不出去的死循环"?

摘要:本文带你用"快慢指针"解决 LeetCode 141 题"环形链表",揭秘 O(1) 空间复杂度的环检测技巧,助你轻松应对算法面试。


核心知识点:龟兔赛跑算法

在职场摸鱼(划掉)摸爬滚打久了,你可能会遇到那种"做了半天又回到原点"的需求,这就好比链表里的"环"。如果要检测一个链表是否有环,最朴素的想法是用一个哈希表把走过的节点存起来,但这样太费内存了。

"快慢指针" (也叫龟兔赛跑算法)是一个绝妙的替代方案:

  • 慢指针(乌龟) :每次只走 1 步。
  • 快指针(兔子) :每次走 2 步。

原理很简单

  1. 如果链表没环,兔子会先跑到终点(null),任务结束。
  2. 如果链表有环,兔子虽然跑得快,但它每跑一圈就会离乌龟更近一步(相对速度为 1),最终一定会在环里追上乌龟。

这就像是你在操场跑步,如果跑道是直的,跑得快的人先到终点;如果跑道是圆的,跑得快的人迟早会从后面"套圈"追上跑得慢的人。


题目解析:LeetCode 141. 环形链表

题目描述 : 给你一个链表的头节点 head,判断链表中是否有环。

示例 : 输入:head = [3,2,0,-4](尾节点连接到值为 2 的节点) 输出:true


解题思路:用"套圈"检测环
  1. 起跑线:快慢指针都从头节点出发。
  2. 赛跑
    • 慢指针走一步。
    • 快指针走两步(注意要先判断快指针是否还能走两步,防止空指针异常)。
  3. 判定
    • 如果快慢指针相遇了,说明有环。
    • 如果快指针跑到了终点,说明没环。

代码实现(Python)
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
        
        # 初始化快慢指针,都指向头节点
        slow = head
        fast = head
        
        # 当快指针和它的下一个节点都不为空时,继续循环
        # 这里用 fast 而不是 slow 是因为 fast 跑得快,先碰到终点
        while fast and fast.next:
            # 慢指针走一步
            slow = slow.next
            # 快指针走两步
            fast = fast.next.next
            
            # 如果快慢指针相遇,说明有环
            if slow == fast:
                return True
        
        # 如果循环正常结束,说明快指针跑到了终点,没有环
        return False

写在最后

这道题不仅是一个算法技巧,更像是一种职场哲学:如果你发现每天的工作都在重复循环,那可能不是你效率低,而是这个"链表"本身就有个环。这时候,与其埋头苦干(遍历),不如换个思路(快慢指针),或许能更快发现问题的本质。

我是 爱摸鱼的打工仔,我们下期见!🐟

相关推荐
2501_926978338 小时前
AGI 的四种瓶颈:资源型还是发现型--以及DSH的位置
人工智能·经验分享·笔记·ai写作
liuqs3329 小时前
nat123安卓和nat123全端口选型指南,映射工具怎么挑
网络·笔记
xian_wwq9 小时前
【学习笔记】光伏“四可”装置纵密模块--配置方法和原理
笔记·学习
Nil20811 小时前
leetcode 160相交链表
算法·leetcode·链表
日拱一卒的小田12 小时前
ZYNQ学习笔记3-ZYNQ的IIC控制器1
笔记·单片机·学习
ZC跨境爬虫13 小时前
LeetCode 108. 将有序数组转换为二叉搜索树(递归构建详解 + Java Python 实现)
java·python·leetcode
Tisfy13 小时前
LeetCode 3090.每个字符最多出现两次的最长子字符串:二重循环 / 滑动窗口
算法·leetcode·字符串·题解·模拟·双指针·滑动窗口
不会代码的小猴13 小时前
C++新增关键字
开发语言·c++·笔记
LuminousCPP14 小时前
栈和队列专题(一):LeetCode 20. 有效的括号
数据结构·经验分享·笔记·leetcode·手写栈
白狐_79816 小时前
408 数据结构|线索二叉树两题详解:先序线索化后的空链域 + 中序前驱/后继判断
c语言·数据结构·链表