1. 合并有序链表问题概述
链表合并是算法学习中的经典问题,也是实际开发中经常遇到的场景。比如在数据库索引合并、日志文件归并等场景中,都需要处理类似的有序序列合并问题。这道题目看似简单,但能很好地考察我们对链表操作和递归思想的理解。
题目要求将两个已经按升序排列的链表合并为一个新的升序链表。新链表应该通过重新拼接原有链表的节点来完成,而不是创建全新的节点。这在实际应用中很有意义,因为避免了不必要的内存分配和拷贝操作。
链表结构相比数组在处理插入、删除操作时具有天然优势,时间复杂度为O(1)。但链表不能随机访问,必须顺序遍历,这使得合并操作需要特殊的处理技巧。理解这个问题的解法,对掌握链表操作和递归思维都有很大帮助。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 双指针解法详解
2.1 双指针法的基本思路
双指针法是解决链表问题的常用技巧。在这个问题中,我们维护两个指针分别指向两个链表的当前节点,比较这两个节点的值,将较小的节点连接到结果链表中,并移动相应的指针。
具体步骤:
- 创建一个虚拟头节点(dummy node)作为结果链表的起始点
- 初始化两个指针p1和p2分别指向两个链表的头节点
- 比较p1和p2所指节点的值
- 将较小值的节点连接到结果链表
- 移动较小值节点所在链表的指针
- 重复3-5步直到其中一个指针为空
- 将剩余非空链表直接连接到结果链表末尾
提示:使用虚拟头节点可以简化代码,避免处理结果链表为空时的特殊情况。
2.2 Python实现代码
python复制class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
class Solution:
def mergeTwoLists(self, list1: ListNode, list2: ListNode) -> ListNode:
dummy = ListNode() # 创建虚拟头节点
current = dummy # 当前节点指针
while list1 and list2:
if list
