题目:合并两个有序链表
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-two-sorted-lists/
解题思路
两条有序链表合并,简单的思路就是新建一个空链表,同时横向对比两个链表每一个值的大小进行拼接,具体步骤如下:
- 对
L1
和L2
进行循环对比,去相对小值拼接进L3
,如下图:
在两个值想等情况下先取L1
的值进行拼接,拼接后L1
当前值移动到下一位,如下图: - 继续循环比较
L1
和L2
的值,右上图可以看出L1
当前值要比L2
当前值大,因此L2
当前值继续拼接到L3
同时移动到下一位 - 重复以上步骤,循环的终止条件设定为
L1
和L2
同时不为空,因为L1
和L2
的长度有可能是不相同的,可能出现L1
已经循环为空但是L2
还有剩余节点,所以循环对比后再加两个判定:
if(l1){
cur.next = l1
}
if(l2){
cur.next = l2
}
判断哪个不为空就直接拼接到L3
上,最后返回L3
初始值的下一个节点
代码实现
const mergeTwoLists = function(l1, l2) {
let vlist = new ListNode(null),
cur = vlist;
while(l1 && l2){
if(l1.val < l2.val){
cur.next = l1
l1 = l1.next
}else if(l1.val === l2.val){
cur.next = l1
l1 = l1.next
}else {
cur.next = l2
l2 = l2.next
}
cur = cur.next
}
if(l1){
cur.next = l1
}
if(l2){
cur.next = l2
}
cur = vlist.next
vlist = null
return cur
};