27.合并两个有序链表(学习)
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 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 均按 非递减顺序 排列
解析:
一、初始化:
1.创建一个哑节点(dummy),它的next属性初始化为null。这个哑节点不会成为新链表的一部分,但它为新链表提供了一个统一的头部,使得在头部插入节点时不需要进行特殊处理。
2.初始化一个指针(curr)指向哑节点,用于构建新链表。
二、遍历和合并:
1.当l1和l2都不为空时,比较它们的头节点值。
2.将值较小的节点连接到curr.next,并更新curr为这个新连接的节点。
3.移动值较小的那个链表的头指针到下一个节点。
4.重复上述步骤,直到其中一个链表为空。
三、处理剩余部分:
1.如果在遍历结束后l1或l2还有剩余节点,直接将剩余部分连接到新链表的末尾。因为两个链表都是已排序的,所以剩余部分自然也是有序的,可以直接连接。
四、返回结果:
1.返回哑节点的下一个节点(dummy.next),这是新链表的头节点。哑节点本身不会被包括在新链表中。
var mergeTwoLists = function(l1, l2) {
// 创建一个哑节点来简化链表头部插入操作
let dummy = new ListNode(0);
let curr = dummy;
while (l1 && l2) {
if (l1.val < l2.val) {
curr.next = l1;
l1 = l1.next;
} else {
curr.next = l2;
l2 = l2.next;
}
curr = curr.next;
}
// 如果l1或l2还有剩余节点,直接将剩余部分连接到新链表的末尾
if (l1) {
curr.next = l1;
}
if (l2) {
curr.next = l2;
}
return dummy.next; // 返回哑节点的下一个节点,即新链表的头节点
};