这是我参与11月更文挑战的第22天,活动详情查看:2021最后一次更文挑战
题目
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例1
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
示例2
输入:l1 = [], l2 = []
输出:[]
示例3
输入:l1 = [], l2 = [0]
输出:[0]
思路
题目给了两个 升序链表,要求合并两个链表,返回一个依然是升序的链表
既然是链表结构,那么遍历两个链表是必然要做的事情,在遍历的过程中,可以判断两个链表的当前节点的大小,即 node.val
。谁比较小,就把谁放在新链表的前面,然后将当前节点的引用改为下一个节点,即 node = node.next
;重复上述步骤,新链表就是合并题目所给的两个链表之后的结果,同时也是升序的。
步骤如下:
-
新建一个空链表
head = h = new ListNode()
-
每次遍历两个链表,考虑以下情况
-
两个链表都未遍历完成:取两个链表的当前节点,比较大小,将较小的节点复制给
h.next
,同时将当前链表(l1 | l2)指向下一个节点,即(l1 = l1.next | l2 = l2.next
),也需将新链表的节点指向下一个节点; -
有一个链表已经遍历完成(
l1
),则只需要将l2
复制给新链表当前节点的下一个节点的引用h.next = l2
;这时,因为有一个链表已经遍历完成,无需再遍历了,返回新链表的头节点即可head.next
-
代码如下
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} l1
* @param {ListNode} l2
* @return {ListNode}
*/
var mergeTwoLists = function(l1, l2) {
if(!l1) return l2;
if(!l2) return l1;
let head = h = new ListNode();
while(l1 || l2) {
if(l1 && l2) {
if(l1.val <= l2.val) {
h.next = new ListNode(l1.val);
l1 = l1.next;
} else {
h.next = new ListNode(l2.val);
l2 = l2.next;
}
} else if(l1) {
h.next = l1;
return head.next;
} else {
h.next = l2;
return head.next;
}
h = h.next;
}
return head.next;
};
小结
这道题还是比较简单的,只需要掌握链表的遍历方式即可(head = head.next
)
LeetCode 👉 HOT 100 👉 合并两个有序链表 - 简单题 ✅
合集:LeetCode 👉 HOT 100,有空就会更新,大家多多支持,点个赞👍