链表面试天花板:环形链表(141/142)深度解析

链表面试天花板:环形链表(141/142)深度解析
在这里插入图片描述
🏠个人主页:黎雁
🎬作者简介:C/C++/JAVA后端开发学习者
❄️个人专栏:C语言数据结构(C语言)EasyXJAVA数据结构与算法(JAVA)游戏规划程序人生
✨ 从来绝巘须孤往,万里同尘即玉京
在这里插入图片描述


文章目录

在这里插入图片描述

链表面试天花板:环形链表(141/142)深度解析 🌀

LeetCode 141 判断环 + 142 找环入口,快慢指针数学证明+最优模板,面试手撕不慌

📝 文章摘要

  • 阅读时长:20 分钟
  • 适合人群
    1. 链表算法进阶者 → 重点:快慢指针数学证明、环入口推导、通用结论
    2. 面试/笔试刷题党 → 重点:最优代码模板、边界处理、思考题解答
    3. 算法原理深究者 → 重点:速度差/环长/初始距离的数学关系
    4. 复习总结同学 → 重点:核心结论、证明过程、代码一键套用
  • 本文内容
    全覆盖 LeetCode 141 环形链表(判断环)+ 142 环形链表II(找环入口),包含快慢指针解法、数学证明、思考题详细解答、通用结论推导,从“会用”到“懂原理”!

🧠 前置知识回顾

做环形链表题前,你需要掌握:

  1. 快慢指针基础用法(步长差、相遇逻辑)
  2. 最大公约数(gcd)数学概念
  3. 链表遍历、边界判断(null 处理)
  4. 简单代数推导能力
    这两道题是链表面试最难的经典题,掌握原理=吃透链表快慢指针所有考点!

1. 环形链表(LeetCode 141)🔍

题目:给定链表头结点 head,判断链表是否有环。若有环返回 true,否则返回 false

思路一:快慢指针(最推荐 ✅)

核心思想

  • 慢指针 slow 每次走 1 步,快指针 fast 每次走 2 步
  • 有环 → fast 会在环内追上 slow(相遇)
  • 无环 → fast 先走到链表末尾 null

完整可运行代码

/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int val) { this.val = val; } * } */publicclassSolution{publicbooleanhasCycle(ListNode head){// 边界:空链表/单节点链表无环if(head ==null|| head.next ==null){returnfalse;}ListNode slow = head;ListNode fast = head;// 循环条件:fast没到末尾(避免空指针)while(fast !=null&& fast.next !=null){ slow = slow.next;// 慢指针走1步 fast = fast.next.next;// 快指针走2步// 相遇则有环if(slow == fast){returntrue;}}// fast走到末尾,无环returnfalse;}}

核心思考题(面试高频追问)

Q1:为什么 slow 走1步、fast 走2步一定能相遇?

数学证明

  1. slow 进入环时,fast 已经在环内,设两者初始距离为 n(环内节点数差)
  2. 每轮移动:fastslow 多走 2-1=1 步,即两者距离每次缩小1
  3. 距离变化:n → n-1 → n-2 → ... → 2 → 1 → 0
  4. 距离为 0 时必然相遇,证毕。
Q2:slow 走1步、fast 走3步,一定能追上吗?

结论:不一定,可能永远追不上 ❌
详细证明

  1. slow 进环后,设与 fast 初始距离为 n,环长度为 C
  2. 每轮移动:fastslow 多走 3-1=2 步,距离每次缩小 2
  3. 分两种情况:
    • n 为偶数:距离变化 n → n-2 → ... → 2 → 0 → 能相遇
    • n 为奇数:距离变化 n → n-2 → ... → 3 → 1 → -1(-1 表示 fast 反超 slow
      反超后,两者新距离为 C-1
      • C-1 为偶数 → 能相遇
      • C-1 为奇数 → 进入死循环(距离永远是奇数,反复反超)
Q3:slow 走2步、fast 走3步,可行吗?

结论:不一定,需满足数学条件 ✅/❌

Q4:快慢指针能追上的通用结论?

核心推导
设:

  • 慢指针步长 S,快指针步长 FF > S
  • 环长度 Cslow 进环时与 fast 初始距离 n0 ≤ n ≤ C
  • 每轮速度差 d = F - S
  • 追上时经过 k 轮,fast 绕环 m

则满足:k × d = n + m × C
变形得:k × d - m × C = n

g = gcd(d, C)(速度差与环长的最大公约数),则左边 k×d - m×C 必为 g 的倍数,因此:

通用结论:当且仅当「初始距离 n」是「速度差 d」和「环长 C」的最大公约数 g 的倍数时,快慢指针能相遇。

结论验证

  • case1(1步+2步)S=1, F=2 → d=1g = gcd(1, C) = 1
    无论 n 是多少,都是 1 的倍数 → 必相遇 ✅
  • case2(1步+3步)S=1, F=3 → d=2g = gcd(2, C)
    • C 为奇数 → g=1 → 必相遇
    • C 为偶数 → g=2 → 仅当 n 为偶数时相遇

2. 环形链表II(LeetCode 142)🎯

题目:给定链表头节点 head,返回链表开始入环的第一个节点;无环则返回 null

思路一:快慢指针 + 双指针找入口(最推荐 ✅)

核心思想

  1. 找相遇点:快慢指针(1步+2步)找到环内相遇节点
  2. 找入口点:头节点 head 和相遇点 meet 各走1步,相遇处即为环入口

完整可运行代码

/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int val) { this.val = val; } * } */classSolution{publicListNodedetectCycle(ListNode head){// 边界:空链表/单节点链表无环if(head ==null|| head.next ==null){returnnull;}ListNode fast = head;ListNode slow = head;// 第一步:找快慢指针相遇点while(fast !=null&& fast.next !=null){ slow = slow.next; fast = fast.next.next;// 找到相遇点,开始找环入口if(slow == fast){ListNode meet = slow;// 第二步:head和meet各走1步,相遇即入口while(head != meet){ head = head.next; meet = meet.next;}return head;// 或 return meet}}// 无环returnnull;}}

核心思考题证明:为什么 head 和 meet 走1步会在入口相遇?

变量定义
  • L:入环前链表长度(头节点 → 环入口)
  • X:相遇点 → 环入口的距离(环内)
  • C:环的长度
  • N:fast 绕环的圈数(N ≥ 1
代数推导
  1. fast 走的路程 = 2 × slow 走的路程
  2. fast 路程:L + N×C + X(入环前 + 绕环N圈 + 相遇点到入口)
  3. slow 路程:L + X(入环前 + 到相遇点)
  4. 等式:L + N×C + X = 2 × (L + X)
  5. 化简:N×C = L + XL = N×C - X
  6. 变形:L = (N-1)×C + (C - X)
结论解读
  • C - X:相遇点绕环走到入口的距离
  • (N-1)×C:绕环 N-1 圈(不影响最终位置)
  • 因此:头节点到入口的距离 L = 相遇点绕环到入口的距离(差整数圈)
  • → 头节点和相遇点各走1步,必然在入口相遇 🎯

📌 核心考点总结(面试必背)

环形链表 141

  1. 最优解法:快慢指针(1步+2步),时间 O(n)、空间 O(1)
  2. 通用结论:初始距离 n 是「速度差 d」和「环长 C」最大公约数的倍数 → 能相遇
  3. 面试回答:优先说1步+2步解法,被追问时讲数学证明

环形链表 142

  1. 核心步骤:先找相遇点 → 再用双指针找入口
  2. 数学本质L = (N-1)×C + (C-X),头节点和相遇点等速走必在入口相遇
  3. 代码模板:背熟!面试直接写,边界处理(空链表/单节点)不能漏

✍️ 写在最后

环形链表是链表面试的终极考点,考察的不仅是代码能力,更是数学推导和逻辑思维:

  • 141 题考“是否能想到快慢指针”
  • 142 题考“是否懂相遇点到入口的推导”
  • 追问考“是否理解快慢指针的通用条件”

建议你:

  1. 背熟141/142 最优代码模板(可直接提交)
  2. 理解并能口述相遇证明+入口推导(面试加分)
  3. 记住通用结论(应对快慢指针步长追问)

至此,链表高频面试题已全部覆盖:
✅ 移除元素 ✅ 反转链表 ✅ 中间节点 ✅ 倒数第k个
✅ 合并链表 ✅ 链表分割 ✅ 回文链表 ✅ 相交链表
✅ 环形链表(判断+找入口)

掌握这些,链表面试 100% 稳过!🚀

觉得有用欢迎 👍点赞、⭐收藏、💬评论,持续更新 Java 数据结构与 LeetCode 算法精讲~

Read more

GitHub 上开源了 30+ 个 OpenClaw 真实使用案例。

最近逛 GitHub 的时候发现了一个挺有意思的仓库,专门收集 OpenClaw 的 usecases。 说实话,很多人装完 OpenClaw 之后的操作都是一样的:疯狂往里面塞各种 Skill,ClawHub 逛得跟菜市场一样热闹,今天装个天气查询,明天装个股票分析,后天又来个翻译助手。 结果装了一堆却发现每天还是在信息搜索、做个记录。Skill 装了一百个,生活一点没变轻松。 这个开源项目就是专门收集人们真实在用的 OpenClaw 场景,而不是单纯介绍某个 Skill 或插件。 01 开源项目简介 awesome-openclaw-usecases 目前收录了 30 多个经过验证的真实使用场景。 它的核心理念非常简单:不是教你装什么 Skill,而是告诉你别人是怎么把 OpenClaw 变成真正能帮人类干活的私人助理的。 如果你不知道 OpenClaw 具体能做什么,只停留在抽象概念。有一些自动化或搭建 AI 智能体想法,但不知道如何系统落地,想参考别人已经跑通的真实工作流和自动化方案。

By Ne0inhk
Enterprise Architect 16 下载、安装与无限30天操作

Enterprise Architect 16 下载、安装与无限30天操作

文章目录 * Enterprise Architect 16 简介 * (一)支持多种建模语言和标准 * (二)强大的版本控制、协作和文档管理功能 * (三)增强的技术和用户体验 * (四)高级功能和扩展性 * 一,下载软件 * (一)官网 * (二)阿里云盘 * (三)百度网盘 * (四)迅雷 * 二,安装软件 * 三,无限30天设置 * (一)删除`fkey.dat`文件 * (二)删除注册表Kane文件夹 * (三)查看效果 Enterprise Architect 16 简介 Enterprise Architect 16是一款功能强大的企业级建模工具,它为企业和机构在系统设计、业务流程建模、数据建模以及软件开发等方面提供了全面的支持。以下是对Enterprise Architect 16的详细介绍:

By Ne0inhk
最新版 Kimi K2.5 进阶实战全攻略:从开源部署到 Agent 集群搭建(视频理解 + 多模态开发 + 高并发调优)

最新版 Kimi K2.5 进阶实战全攻略:从开源部署到 Agent 集群搭建(视频理解 + 多模态开发 + 高并发调优)

1 技术背景与核心架构原理 1.1 技术定位与版本说明 Kimi K2.5 是月之暗面于2026年初发布的开源多模态大语言模型,聚焦长上下文理解、原生多模态交互、Agent 原生支持三大核心能力,针对工业级落地场景完成了全链路优化。本次实战覆盖的开源版本包括: * kimi-k2.5-chat-70b:基础对话版,支持2000K token 上下文窗口,原生适配工具调用 * kimi-k2.5-multimodal-70b:多模态完整版,新增图像、长视频时序理解能力,支持最长10小时连续视频输入 * kimi-k2.5-agent-70b:Agent 优化版,强化多轮工具链执行、分布式状态同步能力,适配集群化部署 * 量化衍生版本:AWQ 4bit/8bit、FP8 量化版,适配低显存硬件环境,精度损失控制在1%以内 1.2 核心架构与技术亮点 1.2.1

By Ne0inhk
宇树 Qmini 双足机器人训练个人经验总结

宇树 Qmini 双足机器人训练个人经验总结

github:https://github.com/vsislab/RoboTamer4Qmini 本篇内容基于我在 AutoDL 云服务器 上对 Qmini 做完整训练与测试的实践总结,涵盖训练、可视化、策略测试、模型导出、URDF 调试等环节,并重点说明 headless(无显示)环境下的各种坑与解决方案。希望能帮到后来者少走弯路。 前提说明:为什么不建议在云端直接跑渲染? 我最开始的目标是:训练、渲染、视频录制全部在 AutoDL 上完成,不经过本地运行。 然而现实是: * 即使用 Xvfb 等虚拟显示器启动 Isaac Gym,也会发生视频保存全黑的情况。 * VNC 远程桌面也无法正常显示 Isaac Gym 的渲染窗口。 * 根本原因来自 驱动版本过高与 Isaac Gym 对驱动的强依赖。 因此更推荐:

By Ne0inhk