news 2026/9/2 22:02:03

算法学习记录19——快慢指针的两种写法和坑

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
算法学习记录19——快慢指针的两种写法和坑

快慢指针的两种写法:我踩过的坑与总结出的五大典型场景

作者:一名做梦都想去大厂做后端开发的 Java 工程师
写于:2025 年 12 月 26 日
背景:最近在刷 LeetCode 和准备系统设计面试时,反复遇到快慢指针问题。总被while的判断条件搞蒙!


一、问题起源:两种写法到底差在哪?

快慢指针的核心思想很简单:slow每次走 1 步,fast每次走 2 步。但循环终止条件却有两种常见写法:

✅ 写法 A(宽松条件):

while(fast!=null&&fast.next!=null){slow=slow.next;fast=fast.next.next;}

✅ 写法 B(严格条件):

while(fast.next!=null&&fast.next.next!=null){slow=slow.next;fast=fast.next.next;}

初看差别不大,但它们决定了slow最终停在哪个“中点”

链表长度写法 A(宽松)写法 B(严格)
1第 1 个第 1 个
2第 2 个第 1 个
3第 2 个第 2 个
4第 3 个第 2 个
5第 3 个第 3 个
  • 写法 A → 后中点(upper middle)
  • 写法 B → 前中点(lower middle)

这个细微差别,在不同算法场景下会产生完全不同的行为。下面是我总结的五大典型应用场景


二、五大典型场景详解

场景 1️⃣:找链表的中间节点(LeetCode 876)

题目要求:如果有两个中间节点,返回第二个

输入: [1,2,3,4] 输出: 节点 3(即第 3 个)

必须用写法 A(宽松条件)
因为题目明确要“后中点”。写法 A 在偶数长度时让slow停在第n/2 + 1个节点。

💡 面试陷阱:如果用写法 B,会返回节点 2,直接 Wrong Answer。


场景 2️⃣:链表归并排序(LeetCode 148)

目标:将链表从中间断开,递归排序左右两半。

关键代码:

// 找到前中点while(fast.next!=null&&fast.next.next!=null){slow=slow.next;fast=fast.next.next;}ListNodemid=slow.next;slow.next=null;// 断开!

必须用写法 B(严格条件)
原因:

  • 左半部分长度 ≤ 右半部分,避免无限递归(比如 [1,2] 如果断成 [1,2] 和 null 就炸了)。
  • 对于偶数长度 n,左半段为 n/2,右半段为 n/2;奇数时左为 (n-1)/2,右为 (n+1)/2。

🛠️ 实战经验:我在蚂蚁做日志链表合并时,就因用错写法导致栈溢出 OOM。


场景 3️⃣:判断回文链表(LeetCode 234)— 反转后半段法

策略:找到中点 → 反转后半段 → 逐个比较。

// Step 1: 找中点(后中点)while(fast!=null&&fast.next!=null){slow=slow.next;fast=fast.next.next;}// slow 现在是后半段的起点(偶数时是第 n/2+1 个)ListNodesecondHalf=reverse(slow);

必须用写法 A(宽松条件)
因为我们要从第二个中间节点开始反转。例如[1,2,2,1],反转从第 3 个节点(值为 2)开始,才能和前半段[1,2]对比。

⚠️ 如果用写法 B,会把第一个 2 当作后半段起点,导致比较错位。


场景 4️⃣:Floyd 判圈算法(LeetCode 141 & 142)

目标:检测环 + 找环入口。

核心循环:

while(fast!=null&&fast.next!=null){slow=slow.next;fast=fast.next.next;if(slow==fast){/* 有环 */}}

必须用写法 A(宽松条件)
原因:

  • fast每次要走两步,所以必须确保fastfast.next都非空;
  • 写法 B 会提前退出(比如链表只有两个节点且成环:1->2->1),导致漏判。

场景 5️⃣:寻找链表倒数第 K 个节点的“中点辅助法”(变种应用)

虽然通常用双指针(先走 k 步),但在某些分治+中点定位的复杂问题中(如“链表的随机访问优化”),需要精确控制中点位置。

例如:将链表转换为高度平衡的二叉搜索树(LeetCode 109)

// 构建 BST 需要选“前中点”作为根,保证左右子树平衡while(fast.next!=null&&fast.next.next!=null){slow=slow.next;fast=fast.next.next;}// slow 是前中点,作为 rootTreeNoderoot=newTreeNode(slow.val);

必须用写法 B(严格条件)
因为我们要让左子树节点数 ≤ 右子树,符合 AVL 树的平衡要求。若用后中点,左子树可能多一个节点,破坏“高度平衡”。


三、我的记忆口诀

为了不再混淆,我总结了一句口诀:

“要后中点,用 A(宽松);要前中点,用 B(严格)。”

再加一句安全提醒:

“涉及fast.next.next的操作,必须确保fast.next不为空!”

所以:

  • 写法 A:fast != null && fast.next != null→ 安全执行fast.next.next
  • 写法 B:fast.next != null && fast.next.next != null→ 更早退出,保slow在前半

附:速查表

场景需求推荐写法代表题目
找中间节点(返回第二个)后中点ALeetCode 876
链表归并排序前中点(左 ≤ 右)BLeetCode 148
回文链表(反转后半)后中点ALeetCode 234
Floyd 判圈安全走两步ALeetCode 141/142
链表转平衡 BST前中点(平衡)BLeetCode 109

博客完。欢迎留言讨论你遇到的快慢指针坑!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/1 11:24:58

MouseClick:终极智能鼠标连点器如何让工作效率飙升300%?

还在为重复的鼠标点击任务而苦恼吗?每天面对成百上千次的机械点击,不仅消耗宝贵时间,更让手腕酸痛难忍。MouseClick作为一款专业的鼠标自动连点工具,正是为了解决这些痛点而生!这款基于Qt6开发的开源软件,通…

作者头像 李华
网站建设 2026/8/29 19:15:36

树莓派安装拼音输入法:新手快速上手的操作秘籍

树莓派中文输入实战指南:十分钟搞定拼音输入法 你有没有遇到过这种情况——刚把树莓派接上显示器,兴致勃勃地打开浏览器想查点资料,结果发现连“你好”两个字都打不出来?对于中文用户来说,系统默认不支持拼音输入&…

作者头像 李华
网站建设 2026/8/31 21:32:17

NextStep-1震撼发布:140亿参数AI绘图新突破

NextStep-1震撼发布:140亿参数AI绘图新突破 【免费下载链接】NextStep-1-Large 项目地址: https://ai.gitcode.com/StepFun/NextStep-1-Large 导语:StepFun AI推出140亿参数的NextStep-1-Large文本到图像生成模型,采用创新的自回归连…

作者头像 李华
网站建设 2026/8/30 15:40:36

【C++】Template:深入理解特化与分离编译,破解编译难题

C新增的array采用的就是第二种方法&#xff1a;代码语言&#xff1a;javascriptAI代码解释// 定义一个模板类型的静态数组 template<class T, size_t N 10> class array { public:T& operator[](size_t index) { return _array[index]; }const T& operator[](si…

作者头像 李华
网站建设 2026/8/30 17:59:19

PaddlePaddle中文文档质量评测:新手友好度高于TensorFlow?

PaddlePaddle中文文档质量评测&#xff1a;新手友好度高于TensorFlow&#xff1f; 在深度学习框架竞争日益激烈的今天&#xff0c;开发者的选择早已不再局限于“哪个技术更强”&#xff0c;而是转向了更现实的问题&#xff1a;哪个平台能让我更快上手、少踩坑、快速交付项目&am…

作者头像 李华
网站建设 2026/8/27 6:12:59

Starward启动器:重新定义你的米哈游游戏体验

Starward启动器&#xff1a;重新定义你的米哈游游戏体验 【免费下载链接】Starward Game Launcher for miHoYo - 米家游戏启动器 项目地址: https://gitcode.com/gh_mirrors/st/Starward Starward启动器是一款专为米哈游游戏玩家设计的第三方启动器&#xff0c;通过智能…

作者头像 李华