难度:简单
题目:
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 1:
css
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
示例 2:
css
输入:l1 = [], l2 = []
输出:[]
示例 3:
css
输入:l1 = [], l2 = [0]
输出:[0]
提示:
- 两个链表的节点数目范围是
[0, 50]
-100 <= Node.val <= 100
l1
和l2
均按 非递减顺序 排列
解题思路:
- 初始化 :创建一个虚拟头结点
dummy
,并定义一个指针current
指向dummy
。虚拟头结点的作用是为了简化边界情况的处理,如链表的起始位置。 - 遍历两个链表 :只要两个链表都有节点,比较当前
l1
和l2
节点的值,将较小值的节点连接到current
的后面,并将current
指向新添加的节点。然后将较小值节点所在链表的指针向前移动。 - 处理剩余节点 :当其中一个链表遍历完后,将另一个链表的剩余部分连接到
current
的后面。 - 返回结果 :返回
dummy.next
,即合并后的新链表的头结点。
JavaScript代码实现:
ini
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} list1
* @param {ListNode} list2
* @return {ListNode}
*/
var mergeTwoLists = function(list1, list2) {
// 创建虚拟头结点
const dummy = new ListNode();
let current = dummy;
// 遍历两个链表
while (list1 && list2) {
if (list1.val < list2.val) {
current.next = list1;
list1 = list1.next;
} else {
current.next = list2;
list2 = list2.next;
}
current = current.next;
}
// 连接剩余节点
current.next = list1 || list2;
// 返回合并后链表的头结点
return dummy.next;
};