新闻详情

新闻详情

首页 / 资讯中心 / 详情

LeetCode-Go 题解:21. Merge Two Sorted Lists 合并两个有序链表(递归实现与源码剖析)

发布时间:2026/9/13 6:08:40来源:尧图网络
LeetCode-Go 题解:21. Merge Two Sorted Lists 合并两个有序链表(递归实现与源码剖析)
LeetCode-Go 题解21. Merge Two Sorted Lists 合并两个有序链表递归实现与源码剖析【免费下载链接】LeetCode-Go✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Go本文围绕 LeetCode 第 21 题「Merge Two Sorted Lists」展开以 LeetCode-Go 仓库中 0021.Merge-Two-Sorted-Lists 目录的题解文档、Go 实现与单元测试为主体讲解如何用递归方式把两个升序链表合并为一个新链表并深入剖析ListNode数据结构、链表与切片互转的辅助函数以及测试用例的组织方式。读完本文你将掌握该题的递归解法原理、边界条件处理、复杂度分析并能直接复用仓库中的辅助函数在本地运行验证。题目描述原题要求参见 0021.Merge-Two-Sorted-Lists 题解文档Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.即合并两个有序链表返回一个新链表。新链表通过拼接两个输入链表的节点构成不新建节点数据而是直接复用原有节点进行串联。示例Input: 1-2-4, 1-3-4 Output: 1-1-2-3-4-4题目大意合并 2 个有序链表参见 README.md。解题思路原题解文档给出的思路非常简洁——Just follow the problem statement按照题意直接模拟即可。核心策略是两个链表都是升序的每次比较两个链表的头节点取较小者作为合并结果的当前节点将较小节点的Next指向剩余部分继续合并的结果当某一链表先被取空时直接把另一链表的剩余部分接到结果尾部。由于每一步都只处理当前两个头节点且剩余问题与原问题结构完全相同仍然是合并两个有序链表天然适合递归实现。Go 递归实现仓库中的完整实现位于 21. Merge Two Sorted Lists.go与题解文档中的代码一致package leetcode import ( github.com/halfrost/LeetCode-Go/structures ) // ListNode define type ListNode structures.ListNode /** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } */ func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode { if l1 nil { return l2 } if l2 nil { return l1 } if l1.Val l2.Val { l1.Next mergeTwoLists(l1.Next, l2) return l1 } l2.Next mergeTwoLists(l1, l2.Next) return l2 }逐行解读空指针兜底if l1 nil { return l2 }与if l2 nil { return l1 }是递归的终止条件。当某一链表已遍历完时直接返回另一链表剩余部分即可这正是拼接splicing节点的体现——不复制节点直接复用原链表节点。递归选择较小头节点若l1.Val l2.Val说明l1的头节点应排在前面于是l1.Next指向「l1.Next与l2合并」的结果并返回l1否则对称处理l2。等值情形当l1.Val l2.Val时走else分支即优先选取l2的头节点。这与官方示例1-2-4, 1-3-4 1-1-2-3-4-4的排序语义一致等值元素谁先谁后均满足非降序要求。复杂度分析时间复杂度$O(m n)$其中 $m$、$n$ 分别为两个链表的长度。每个节点在递归中恰好被访问一次。空间复杂度$O(m n)$递归调用栈深度。若改为迭代写法空间复杂度可降至 $O(1)$这也是工程实现中更常见的选择递归写法胜在代码简洁、可读性高。递归执行过程演示以1-2-4与1-3-4为例递归展开如下mergeTwoLists(1-2-4, 1-3-4) l1.Val(1) l2.Val(1)不满足 走 else l2.Next mergeTwoLists(1-2-4, 3-4) l1.Val(1) l2.Val(3) → l1.Next mergeTwoLists(2-4, 3-4) → 返回 1-... 2 3 → l2.Next mergeTwoLists(4, 3-4)... ...依次归并最终得到 1-1-2-3-4-4链表数据结构与辅助函数题解代码通过type ListNode structures.ListNode将 structures 包 中的ListNode类型引入其定义位于 structures/ListNode.gotype ListNode struct { Val int Next *ListNode }该文件同时提供了一组链表与切片互转的辅助函数被测试代码大量使用Ints2List(nums []int) *ListNode把整数切片转换成单链表空切片返回nil。实现上先用哨兵节点l : ListNode{}统一追加逻辑最后返回l.Next作为真正的头节点。List2Ints(head *ListNode) []int把链表还原成整数切片。内部带有链条深度限制limit : 100遍历超过 100 个节点会panic并提示链条深度超过 100可能出现环状链条用于防止测试时误入环形链表导致死循环。单元测试与用例设计仓库为本题配备了完整的表驱动测试见 21. Merge Two Sorted Lists_test.go测试通过para21两个[]int参数与ans21期望的[]int结果组织用例func Test_Problem21(t *testing.T) { qs : []question21{ {para21{[]int{}, []int{}}, ans21{[]int{}}}, // 双空 {para21{[]int{1}, []int{1}}, ans21{[]int{1, 1}}}, // 等值单节点 {para21{[]int{1, 2, 3, 4}, []int{1, 2, 3, 4}}, ans21{[]int{1, 1, 2, 2, 3, 3, 4, 4}}}, {para21{[]int{1}, []int{9, 9, 9, 9, 9}}, ans21{[]int{1, 9, 9, 9, 9, 9}}}, // 长度悬殊 {para21{[]int{9, 9, 9, 9, 9}, []int{1}}, ans21{[]int{1, 9, 9, 9, 9, 9}}}, // 顺序对调 {para21{[]int{2, 3, 4}, []int{4, 5, 6}}, ans21{[]int{2, 3, 4, 4, 5, 6}}}, {para21{[]int{1, 3, 8}, []int{1, 7}}, ans21{[]int{1, 1, 3, 7, 8}}}, } // ... for _, q : range qs { _, p : q.ans21, q.para21 fmt.Printf(【input】:%v 【output】:%v\n, p, structures.List2Ints(mergeTwoLists(structures.Ints2List(p.one), structures.Ints2List(p.another)))) } }这些用例覆盖了本题的典型边界两个空链表返回空结果mergeTwoLists中两次nil判断返回nil单节点等值验证稳定输出1-1长度悬殊1与9,9,9,9,9及其对调版本验证某一链表先耗尽后剩余部分直接拼接等值交错2,3,4与4,5,6、1,3,8与1,7覆盖等值元素与大小交替插入的场景。运行go test ./leetcode/0021.Merge-Two-Sorted-Lists/ -v即可在本地复现上述用例输出。扩展从两两合并到合并 K 个有序链表mergeTwoLists也是 LeetCode 第 23 题「Merge k Sorted Lists」的基础。仓库中 0023.Merge-k-Sorted-Lists 的分治解法即把lists一分为二递归合并最终调用两个链表的合并逻辑完成归并func mergeKLists(lists []*ListNode) *ListNode { length : len(lists) if length 1 { return nil } if length 1 { return lists[0] } num : length / 2 left : mergeKLists(lists[:num]) right : mergeKLists(lists[num:]) // ... 最终调用两个有序链表的合并 }可见吃透mergeTwoLists的递归与边界处理是进一步掌握归并排序思想在链表上应用的基石。小结题解文档给出的递归解法按照题意模拟实现仅 6 行核心逻辑通过nil兜底 递归选小完成合并仓库源码 21. Merge Two Sorted Lists.go 复用 structures.ListNode 类型测试借助Ints2List/List2Ints完成链表与切片的双向转换测试用例覆盖双空、等值、长度悬殊、交错排序等边界场景可直接通过go test验证该解法同时是合并 K 个有序链表0023分治实现的基础值得深入理解。【免费下载链接】LeetCode-Go✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Go创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

MoE模型在数据稀缺下的重复过拟合问题解析 2026/9/13 6:50:44

MoE模型在数据稀缺下的重复过拟合问题解析

1. 项目概述:当数据稀缺遇上专家模型,过拟合为何会“认准一个样本地反复咀嚼”“Data Scarcity and Model Sparsity: Mixtures-of-Experts Overfit More to Repeated Data”——这个标题不是一篇泛泛而谈的理论综述,而是直击当前大模型落地中…

阅读更多 →
大模型是怎么造出来的?从数据清洗到部署推理的完整流程 2026/9/13 6:50:43

大模型是怎么造出来的?从数据清洗到部署推理的完整流程

说在前头,我见过不少刚开始学大模型的人,一上来就盯着“transformer”“attention”“loss”这些词啃,结果啃了两周还说不清“大模型到底是怎么造出来的”。这很正常,因为大模型这条链路实在太长了,从原始数据到最终的…

阅读更多 →
AR开发核心技术:空间计算与交互实现详解 2026/9/13 6:50:43

AR开发核心技术:空间计算与交互实现详解

1. AR技术中的空间计算基础解析 当我们在手机屏幕上看到虚拟恐龙在客厅里踱步,或是通过AR眼镜看到导航箭头直接投射在真实路面上时,背后都离不开一套精密的数学计算体系。作为AR开发的核心支撑,空间计算技术决定了虚拟内容能否准确"锚定…

阅读更多 →
Google Analytics Admin API PHP 客户端库安装与实战指南(skills29 skills 项目) 2026/9/13 6:50:43

Google Analytics Admin API PHP 客户端库安装与实战指南(skills29 skills 项目)

Google Analytics Admin API PHP 客户端库安装与实战指南(skills29 skills 项目) 【免费下载链接】skills Agent Skills for Google products and technologies 项目地址: https://gitcode.com/GitHub_Trending/skills29/skills 本指南围绕 skill…

阅读更多 →
可持续技术与资本市场估值:纺织回收案例解析 2026/9/13 6:50:43

可持续技术与资本市场估值:纺织回收案例解析

1. 项目背景与核心关联性解析这个看似跨界的研究课题实际上揭示了现代经济体系中两个关键领域的深层互动。作为在金融和环保科技交叉领域工作多年的从业者,我最初也对这个关联性感到好奇,直到在一次可持续时尚峰会上与几位基金经理的对话才恍然大悟——资…

阅读更多 →
Shell脚本路径可靠性保障:realpath原理与工程实践 2026/9/13 6:47:43

Shell脚本路径可靠性保障:realpath原理与工程实践

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

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞