1. 问题背景与需求分析
合并两个有序链表是数据结构与算法中的经典问题,也是面试中的高频考点。这个问题要求我们将两个已经按升序排列的链表合并为一个新的有序链表,且不能创建新的链表节点,只能通过调整原有节点的指针来实现。
在实际开发中,这种操作常见于:
- 数据库查询结果的合并
- 日志文件的归并处理
- 分布式系统中多个有序数据流的合并
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 递归解法深度解析
2.1 递归思路拆解
递归解法的核心思想是将大问题分解为相同性质的子问题。对于合并两个链表,我们可以这样思考:
- 比较两个链表当前头节点的值
- 将较小值的节点作为合并后链表的头节点
- 对剩下的部分递归执行相同的操作
cpp复制ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
if(list1 == nullptr) return list2;
if(list2 == nullptr) return list1;
if(list1->val <= list2->val) {
list1->next = mergeTwoLists(list1->next, list2);
return list1;
} else {
list2->next = mergeTwoLists(list1, list2->next);
return list2;
}
}
2.2 递归终止条件
递归必须要有明确的终止条件,否则会导致无限递归。对于链表合并,终止条件是:
- 其中一个链表为空(nullptr),此时直接返回另一个链表
- 因为链表本身是有序的,所以当某个链表遍历完毕时,另一个链表剩余部分可以直接接上
2.3 递归调用栈分析
每次递归调用都会在调用栈中创建一个新的栈帧,保存当前函数的局部变量和返回地址。对于长度为m和n的两个链表,最坏情况下递归深度为m+n。
注意:虽然递归解法代码简洁,但对于很长的链表可能导致栈溢出。在实际工程中,如果链表长度不可控,建议使用迭代解法。
3. 迭代解法实现细节
3.1 迭代算法流程
迭代解法通过循环逐个
