题目要求
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
解题思路一(推荐)
这题用了递归的思路,一共六行,很是精简,非常值得学习。
首先判断是否有一个链表为空,有,则返回不为空的链表。
若都不为空,选择值小的链表作为l1。当递归返回的时候,就会串成一个从小到大的链表。
var mergeTwoLists = function(l1, l2) {
if (!l1 || !l2) // return the non-empty one
return l1 || l2
if (l1.val > l2.val) // l1和l2交换位置,保证l1一直小于l2
[l1, l2] = [l2, l1]
l1.next = mergeTwoLists(l1.next, l2)
return l1;
};
运行结果
解题思路二
这题就是常规思路了,新建一个ListNode,循环将最小的往上挂,最后返回新建的链表。
var mergeTwoLists = function(l1, l2) {
let preNode = new ListNode(-1)
let cur = preNode
while(l1 && l2){
if(l1.val<l2.val){
cur.next = l1
cur = cur.next
l1 = l1.next
}else{
cur.next = l2
cur = cur.next
l2 = l2.next
}
}
cur.next = l1 || l2
return preNode.next
};