合并两个排序的链表是一个经典的算法问题。
问题描述
将两个升序排列的链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
思路分析
我们可以使用迭代的方法来解决这个问题:
- 创建哑节点:创建一个哑节点(dummy node)作为新链表的起始点,这样可以简化边界情况的处理
- 双指针遍历:使用两个指针分别遍历两个链表
- 比较并连接:比较两个指针当前节点的值,将较小的节点连接到新链表中
- 处理剩余节点:当其中一个链表遍历完后,将另一个链表的剩余部分直接连接到新链表的末尾
代码实现
链表节点定义
class ListNode {
int val;
ListNode next;
ListNode(int val) {
this.val = val;
}
}
方法一:迭代法
public class MergeSortedLists {
/**
* 迭代法合并两个有序链表
* 时间复杂度:O(m+n),空间复杂度:O(1)
*/
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
// 创建哑节点,简化边界处理
ListNode dummy = new ListNode(-1);
ListNode current = dummy;
// 同时遍历两个链表
while (list1 != null && list2 != null) {
if (list1.val <= list2.val) {
current.next = list1;
list1 = list1.next;
} else {
current.next = list2;
list2 = list2.next;
}
current = current.next;
}
// 连接剩余部分
current.next = (list1 != null) ? list1 : list2;
return dummy.next;
}
}
方法二:递归法
public class MergeSortedLists {
/**
* 递归法合并两个有序链表
* 时间复杂度:O(m+n),空间复杂度:O(m+n) - 递归栈空间
*/
public ListNode mergeTwoListsRecursive(ListNode list1, ListNode list2) {
// 基准情况
if (list1 == null) {
return list2;
}
if (list2 == null) {
return list1;
}
// 递归情况
if (list1.val <= list2.val) {
list1.next = mergeTwoListsRecursive(list1.next, list2);
return list1;
} else {
list2.next = mergeTwoListsRecursive(list1, list2.next);
return list2;
}
}
}
517

被折叠的 条评论
为什么被折叠?



