题目描述
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 1:
输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4]示例 2:输入:l1 = [], l2 = [] 输出:[]
示例 3:输入:l1 = [], l2 = [0] 输出:[0]
提示:
- 两个链表的节点数目范围是
[0, 50]
-100 <= Node.val <= 100
l1
和l2
均按 非递减顺序 排列
解题思路
要将两个升序链表合并为一个新的升序链表,我们可以使用双指针法来逐个比较两个链表的节点,然后将较小的节点添加到结果链表中。
-
初始化:创建一个哨兵节点 (
dummy
),它的next
指向合并后的链表的头节点。这样可以避免处理链表头部特殊情况。创建一个指针current
,指向dummy
。 -
遍历两个链表:比较
l1
和l2
的当前节点值,将较小的那个节点添加到current
的next
,并移动相应链表的指针;current
也相应地向前移动。 -
处理剩余节点:当一个链表遍历完后,将另一个链表的剩余部分直接连接到
current
的next
。 -
返回结果:返回
dummy.next
,这是合并后链表的头节点。
复杂度分析
- 时间复杂度O(m + n):
m
和n
分别是两个链表的长度,我们只需遍历一次所有节点。 - 空间复杂度O(1): 只使用了常量级别的额外空间。
代码实现
package org.zyf.javabasic.letcode.hot100.list;
import org.zyf.javabasic.letcode.list.base.ListNode;
/**
* @program: zyfboot-javabasic
* @description: 合并两个有序链表
* @author: zhangyanfeng
* @create: 2024-08-22 09:49
**/
public class MergeTwoListsSolution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
// 哨兵节点,方便返回结果
ListNode dummy = new ListNode(-1);
ListNode current = dummy;
// 遍历两个链表
while (l1 != null && l2 != null) {
if (l1.val <= l2.val) {
current.next = l1;
l1 = l1.next;
} else {
current.next = l2;
l2 = l2.next;
}
current = current.next;
}
// 处理剩余的节点
if (l1 != null) {
current.next = l1;
} else {
current.next = l2;
}
return dummy.next;
}
public static void main(String[] args) {
MergeTwoListsSolution solution = new MergeTwoListsSolution();
// 测试用例 1
ListNode l1 = new ListNode(1);
l1.next = new ListNode(2);
l1.next.next = new ListNode(4);
ListNode l2 = new ListNode(1);
l2.next = new ListNode(3);
l2.next.next = new ListNode(4);
ListNode mergedList = solution.mergeTwoLists(l1, l2);
printList(mergedList); // 应该输出 [1, 1, 2, 3, 4, 4]
// 测试用例 2
ListNode l3 = null;
ListNode l4 = null;
ListNode mergedList2 = solution.mergeTwoLists(l3, l4);
printList(mergedList2); // 应该输出 []
// 测试用例 3
ListNode l5 = null;
ListNode l6 = new ListNode(0);
ListNode mergedList3 = solution.mergeTwoLists(l5, l6);
printList(mergedList3); // 应该输出 [0]
}
// 打印链表的辅助函数
private static void printList(ListNode node) {
while (node != null) {
System.out.print(node.val + " ");
node = node.next;
}
System.out.println();
}
}
具体可参考:https://zyfcodes.blog.csdn.net/article/details/141401712