news 2026/6/15 12:31:57

链表专题(五):殊途同归——「相交链表」

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
链表专题(五):殊途同归——「相交链表」

场景想象:

有两条路(链表 A 和链表 B),它们在某个路口(交点 Node)汇合了,变成了一条路(Y 字形结构)。

  • 路 A:a1 -> a2 -> c1 -> c2 -> c3(长度 5)

  • 路 B:b1 -> b2 -> b3 -> c1 -> c2 -> c3(长度 6)

  • 交点c1

核心痛点:

如果两条路长度一样,那简单,两个指针一起走,走到相同节点就是交点。

但现在 A 短 B 长。

  • 指针 A 走到c1时,指针 B 还在b3

  • 它们完美错过了,永远遇不到。

  • 怎么让它们在终点相遇?必须抹平长度差。

力扣 160. 相交链表

https://leetcode.cn/problems/intersection-of-two-linked-lists/

题目分析:

  • 输入headA,headB

  • 目标:找到两个链表相交的起始节点。如果不相交,返回 null。

  • 输出:交点 Node。

核心思维:指针拼接 (A + B = B + A)

我们不需要去算长度差 lenA 和 lenB。

有一个更巧妙的办法:

  1. 指针 pA:先走链表 A,走完了,直接跳到链表 B 的头接着走。

  2. 指针 pB:先走链表 B,走完了,直接跳到链表 A 的头接着走。

奇迹发生了:

  • pA 走的路程:A 的前缀+公共部分+B 的前缀

  • pB 走的路程:B 的前缀+公共部分+A 的前缀

  • 路程完全相等!它们一定会在第二次遍历时,在交点处(或者终点 null 处)相遇。

代码实现 (JavaScript)

JavaScript

/** * Definition for singly-linked list. * function ListNode(val) { * this.val = val; * this.next = null; * } */ /** * @param {ListNode} headA * @param {ListNode} headB * @return {ListNode} */ var getIntersectionNode = function(headA, headB) { if (!headA || !headB) return null; let pA = headA; let pB = headB; // 只要两个指针没相遇,就一直跑 // 如果相交,它们会在交点相遇 // 如果不相交,它们会同时走到 null (null === null 退出循环) while (pA !== pB) { // 核心逻辑:走完了自己,就去走对方的路 // 如果 pA 走到头了 (null),就跳到 headB;否则前进一步 pA = pA === null ? headB : pA.next; // 如果 pB 走到头了 (null),就跳到 headA;否则前进一步 pB = pB === null ? headA : pB.next; } // 退出循环时,pA 就是交点(或者 null) return pA; };

深度模拟

假设:

A: 1 -> 2 -> 8 -> 9 (长度4)

B: 3 -> 8 -> 9 (长度3)

交点是 8。

  • Round 1:

    • pA: 1, pB: 3

  • Round 2:

    • pA: 2, pB: 8

  • Round 3:

    • pA: 8, pB: 9

  • Round 4:

    • pA: 9, pB: null (pB 走完了,跳到 A) -> pB 现在指向 1

  • Round 5:

    • pA: null (pA 走完了,跳到 B), pB: 2 -> pA 现在指向 3

  • Round 6:

    • pA: 8, pB: 8

    • 相遇!返回 8。

总结

这道题的代码极简,但背后的思维非常巧妙。

  • 面试官问:如果不能修改链表结构(不能翻转),且空间复杂度要求 $O(1)$(不能用 Set 存节点),怎么做?

  • 标准答案:就是这种**“双指针拼接”法。记住这个浪漫的套路:“我走完我的路,就去走你的路。”**


下一题预告:环形链表 II

好了,链表进阶篇的最后一关:LC 142. 环形链表 II(专题六)。

  • 题目:给定一个链表,如果它有环,请找到入环的那个节点

  • 难点:判断有环很简单(快慢指针追击),但怎么找到入口

  • 这又是一道数学推导题。你需要证明:当快慢指针相遇时,再派一个指针从头开始走,它和慢指针会在入口处相遇。

这是双指针链表题的最终 Boss,准备好做点数学题了吗?🔢

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

字符串哈希冲突规避策略:AI给出多组参数建议

字符串哈希冲突规避策略:AI给出多组参数建议 在算法竞赛和高性能系统开发中,一个看似简单却暗藏玄机的问题时常浮现:两个不同的字符串,为何会“意外”地拥有相同的哈希值?这并非程序出错,而是哈希冲突的经典…

作者头像 李华
网站建设 2026/6/15 10:29:00

从零开始部署VibeThinker-1.5B-APP:Jupyter一键启动脚本使用教程

从零开始部署VibeThinker-1.5B-APP:Jupyter一键启动脚本实战指南 在算法竞赛训练营里,一个学生正为一道动态规划题卡壳。他尝试向云端大模型提问,却因高昂的API费用望而却步——每轮交互成本超过0.1美元,一次完整调试可能耗资数元…

作者头像 李华
网站建设 2026/6/8 4:36:14

GitHub镜像推荐:一键部署VibeThinker-1.5B-APP进行算法竞赛训练

VibeThinker-1.5B-APP:轻量级推理模型的平民化实践 在算法竞赛的世界里,一个困扰无数选手的现实问题始终存在:当你卡在一道中等难度以上的题目上时,除了翻看题解区、搜索博客或等待社区回复,是否有一种更高效的方式能即…

作者头像 李华
网站建设 2026/6/15 11:21:09

精选9款免费论文查重工具,每日不限次数轻松检测

论文查重免费工具排行榜:9大平台每日不限次推荐 核心工具对比速览 工具名称 查重速度 降重效果 特色功能 适用场景 aicheck 极快 重复率可降30% 专业术语保留 高重复率紧急处理 aibiye 中等 逻辑优化明显 学术表达增强 提升论文质量 askpaper 快 …

作者头像 李华
网站建设 2026/6/15 10:26:06

9大免费论文查重工具排行榜,每日不限次数随时查

论文查重免费工具排行榜:9大平台每日不限次推荐 核心工具对比速览 工具名称 查重速度 降重效果 特色功能 适用场景 aicheck 极快 重复率可降30% 专业术语保留 高重复率紧急处理 aibiye 中等 逻辑优化明显 学术表达增强 提升论文质量 askpaper 快 …

作者头像 李华
网站建设 2026/6/10 19:20:10

Docker镜像优化十大陷阱(99%开发者都踩过的坑)

第一章:Docker镜像大小优化的十大陷阱概述在构建高效、轻量的容器化应用时,Docker镜像大小直接影响部署速度、资源占用和安全性。然而,在优化过程中开发者常陷入一些看似合理却适得其反的误区。理解这些陷阱有助于制定更科学的镜像构建策略。…

作者头像 李华