首页/新闻资讯/正文详情

Hot100代码随想录:相交链表、反转链表与回文链表

发布时间:2026/9/26 3:40:54 来源:云帆数科 栏目:资讯中心
Hot100代码随想录:相交链表、反转链表与回文链表
Java HOT100 刷题笔记相交链表、反转链表与回文链表学习日期09 月 21 日关键词链表、双指针、链表反转、空间复杂度、节点身份比较本文记录三道经典链表题。重点不是只记住代码而是理解三个可以反复复用的模型路径对齐、指针反转、快慢指针寻找中点。一、相交链表题目链接LeetCode 160. 相交链表1. 题意与关键点给定两个单链表的头节点判断它们是否相交如果相交返回第一个公共节点否则返回null。这里的“相交”比较的是节点对象是否相同而不是节点值是否相同nodeAnodeB下面两个节点即使值相同也不代表相交链表A1 → 8 → 9 链表B2 → 8 → 9只有当两个链表后半部分引用的是同一批节点对象时才算相交Aa1 → a2 ┐ ├→ c1 → c2 Bb1 → b2 ┘2. 方法一数组逆向比较先把两个链表中的节点引用分别保存到数组中再从数组尾部向前比较。链表相交后公共部分必然一直延伸到尾部因此最后一个连续相同区域的起点就是交点。publicclassSolution{publicListNodegetIntersectionNode(ListNodeheadA,ListNodeheadB){intm0;intn0;for(ListNodepheadA;p!null;pp.next){m;}for(ListNodepheadB;p!null;pp.next){n;}ListNode[]nodesAnewListNode[m];ListNode[]nodesBnewListNode[n];ListNodepheadA;for(inti0;im;i){nodesA[i]p;pp.next;}pheadB;for(inti0;in;i){nodesB[i]p;pp.next;}ListNodeintersectionnull;for(intim-1,jn-1;i0j0nodesA[i]nodesB[j];i--,j--){intersectionnodesA[i];}returnintersection;}}复杂度时间复杂度O(m n)空间复杂度O(m n)。这个方法容易理解但额外保存了全部节点没有充分利用链表结构。3. 方法二双指针路径对齐分别设置两个指针pA先走链表A再走链表B pB先走链表B再走链表A两条路线的总长度相等A B B A如果存在交点两个指针会在交点相遇如果不存在交点两个指针最终会同时到达null。publicclassSolution{publicListNodegetIntersectionNode(ListNodeheadA,ListNodeheadB){ListNodepAheadA;ListNodepBheadB;while(pA!pB){pA(pAnull)?headB:pA.next;pB(pBnull)?headA:pB.next;}returnpA;}}复杂度时间复杂度O(m n)空间复杂度O(1)。4. 为什么必须经过null再切换链表不能在“最后一个节点”处直接跳到另一条链表的头部否则无交点时两个指针会一直在两条链表组成的循环路线中移动却没有共同的节点可以作为退出条件。经过null的意义是null是两个无交点链表共有的结束状态有交点时两个指针在交点相遇无交点时两个指针最终同时成为null循环也能结束。因此null不是为了“方便找最后一个节点”而是为了保证算法在无交点时也能正确终止。5. 本题总结双指针法本质上是在消除两个链表长度差较长链表多走的部分 通过交换路线自动抵消只要看到“两个链表长度不同但需要比较后半段位置”就可以考虑路径对齐思想。二、反转链表题目链接LeetCode 206. 反转链表1. 核心思路原链表1 → 2 → 3 → null反转后null ← 1 ← 2 ← 3每次处理当前节点cur时需要完成三件事保存下一个节点避免链表断开后丢失让当前节点指向前一个节点同时向后移动pre和cur。2. 迭代实现classSolution{publicListNodereverseList(ListNodehead){ListNodeprenull;ListNodecurhead;while(cur!null){ListNodenextcur.next;// 1. 保存后继节点cur.nextpre;// 2. 反转当前指针precur;// 3. pre向后移动curnext;// 4. cur向后移动}returnpre;}}指针变化示例初始prenullcur1 第一次null ← 1 2 → 3 → null 第二次null ← 1 ← 2 3 → null 第三次null ← 1 ← 2 ← 3复杂度时间复杂度O(n)空间复杂度O(1)。3. 易错点最容易漏掉的是ListNodenextcur.next;如果直接执行cur.nextpre;却没有提前保存原来的cur.next就会丢失尚未处理的后半部分链表。三、回文链表题目链接LeetCode 234. 回文链表回文结构从左向右和从右向左读取相同例如1 → 2 → 2 → 1 1 → 2 → 3 → 2 → 11. 方法一转成数组后双指针比较链表不能直接从尾部向前访问因此可以先把节点值保存进数组再使用左右双指针。classSolution{publicbooleanisPalindrome(ListNodehead){ListIntegervaluesnewArrayList();for(ListNodecurhead;cur!null;curcur.next){values.add(cur.val);}intleft0;intrightvalues.size()-1;while(leftright){if(!values.get(left).equals(values.get(right))){returnfalse;}left;right--;}returntrue;}}复杂度时间复杂度O(n)空间复杂度O(n)。这个方法直观适合第一次解决问题但没有达到进阶要求的常量空间。2. 方法二快慢指针 反转后半部分步骤使用快慢指针找到前半部分的末尾反转后半部分链表从两端向中间比较可选再次反转后半部分恢复原链表结构。classSolution{publicbooleanisPalindrome(ListNodehead){if(headnull||head.nextnull){returntrue;}ListNodefirstHalfEndfindFirstHalfEnd(head);ListNodesecondHalfStartreverse(firstHalfEnd.next);booleanresulttrue;ListNodelefthead;ListNoderightsecondHalfStart;while(right!null){if(left.val!right.val){resultfalse;break;}leftleft.next;rightright.next;}// 恢复链表避免函数调用后改变输入结构firstHalfEnd.nextreverse(secondHalfStart);returnresult;}privateListNodefindFirstHalfEnd(ListNodehead){ListNodeslowhead;ListNodefasthead;while(fast.next!nullfast.next.next!null){slowslow.next;fastfast.next.next;}returnslow;}privateListNodereverse(ListNodehead){ListNodeprenull;ListNodecurhead;while(cur!null){ListNodenextcur.next;cur.nextpre;precur;curnext;}returnpre;}}复杂度时间复杂度O(n)空间复杂度O(1)。3. 奇数和偶数长度如何处理使用条件while(fast.next!nullfast.next.next!null)循环结束后slow停在前半部分的最后一个节点偶数1 → 2 → 2 → 1 ↑ slow 奇数1 → 2 → 3 → 2 → 1 ↑ slow反转slow.next开始的后半部分后只需要按照后半部分长度进行比较。奇数链表的中间节点不影响回文判断。四、三道题的共同模式题目核心技巧时间复杂度空间复杂度相交链表双指针路径对齐O(mn)O(1)反转链表pre-cur-next三指针O(n)O(1)回文链表快慢指针 反转后半段O(n)O(1)可以提炼出以下链表解题习惯改变next前先保存原来的后继节点比较是否为同一节点时使用不要只比较val需要找中点时优先考虑快慢指针需要从后往前比较时可以考虑反转链表修改输入链表后实际开发中应考虑是否需要恢复原结构。五、复盘这三道题分别训练了链表中最常见的三种能力路径长度不同 → 双指针换路对齐 链表方向改变 → pre、cur、next 前后对称比较 → 找中点并反转后半部分真正需要记住的不是某一段完整代码而是每个指针在当前时刻代表什么以及修改指针后是否还能够找到剩余链表。

相关推荐

图数据结构全景解析:从存储结构到最短路径与工程应用
图数据结构全景解析:从存储结构到最短路径与工程应用

打开任何一个地图导航App,输入起点和终点,系统几乎瞬间就能给你算出一条甚至好几条推荐路线。你有没有想过,这种"瞬间"背后到底发生了什么?答案就藏在数据结构里那张看不见摸不着的"图"里。微信好友关系、网页… · 2026/9/26 3:40:54

git push 报错 hook declined to update refs/heads/detail-header:TaoToken 统一 Key 通道下的排查与配置骨架
git push 报错 hook declined to update refs/heads/detail-header:TaoToken 统一 Key 通道下的排查与配置骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 3:40:42

Codex并入ChatGPT后踩了5个坑:额度烧成Token刺客、50万重置券翻车、Work/Codex傻傻分不清——用TaoToken统一Key把额度账算明白
Codex并入ChatGPT后踩了5个坑:额度烧成Token刺客、50万重置券翻车、Work/Codex傻傻分不清——用TaoToken统一Key把额度账算明白

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 3:40:42

Codex 和 Claude Code 到底哪个更好?用 TaoToken 统一 Key 实测对比
Codex 和 Claude Code 到底哪个更好?用 TaoToken 统一 Key 实测对比

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 5:06:20

AI检测原理与免费降AI率工具实测:从76%降到18%的十五步流程
AI检测原理与免费降AI率工具实测:从76%降到18%的十五步流程

1. 为什么AI检测总能“一眼识破”你——先弄懂它到底在查什么1.1 检测系统不是“查重”,它盯的是文本的统计特征先说一个很多同学误解的地方:论文AI检测和查重是两码事。查重比对的是文字序列有没有和已发表论文重复,AI检测比对的却是“这段文… · 2026/9/26 5:06:20

Keithley 2400源表I-V测试:从SCPI指令到PyVISA完整指南
Keithley 2400源表I-V测试:从SCPI指令到PyVISA完整指南

简介:Keithley 2400系列数字源表配套测试软件包,面向电子测量、半导体器件I-V特性分析及材料测试等场景,适用于需要借助GPIB或RS-232接口自动化采集I-V、I-t、V-t等曲线的工程师与实验室人员。资源共452个文件,压缩包约283.72MB&a… · 2026/9/26 5:06:20

rrdtool 1.4.7源码编译安装指南:从解压到生成监控图
rrdtool 1.4.7源码编译安装指南:从解压到生成监控图

简介:RRDTool 1.4.7是经典的开源时序数据存储与绘图工具,广泛用于网络流量、CPU、内存等性能指标的采集和可视化,也是Smokeping、Cacti、MRTG等监控系统的底层依赖。该源码包面向运维工程师和二次开发人员,既可手动编译部署&#… · 2026/9/26 5:06:20

AI科技风PPT模板:从zip解析到批量改造的完整指南
AI科技风PPT模板:从zip解析到批量改造的完整指南

简介:这份人工智能Ai科技风PPT模板压缩包,面向需要制作科技项目推介、人工智能项目介绍或工作总结报告的职场人士与学生。模板以机器人元素、点线球状网、几何圆创意封面及黑金配色为设计亮点,将抽象数据与算法可视化,帮助演讲者生… · 2026/9/26 5:06:20

TauriTavern安卓直装原理:本地大模型客户端技术解析
TauriTavern安卓直装原理:本地大模型客户端技术解析

1. TauriTavern 是什么?它和 SillyTavern 的关系不是“安卓版”那么简单很多人看到标题里“手机酒馆 TauriTavern”“安卓直装 SillyTavern 客户端”,第一反应是:“哦,这是 SillyTavern 的手机版?”——这个理解方向错… · 2026/9/26 5:06:08

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21

OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40

向下兼容与向上兼容:接口设计中的兼容性策略与工程实践
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践

一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码