将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
题目来自leetcode
解:
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} l1
* @param {ListNode} l2
* @return {ListNode}
*/
function mergeTwoLists(l1, l2) {
// l1和l2其实是两个链表的链表头,只要有链表头就相当于拿到了这个链表
// 把这个方法理解为对比每一个节点,每次对比返回val小的节点,这样的话就很好理解
if(!l1) {
// 如果l1已经为null了,那么就没必要继续对比下去了,直接返回l2
// 注意l2.next可能还有很长的一串,但是肯定都比l1大,所以直接跟在后面,下面也一样
return l2;
}
if(!l2) {
return l1;
}
if (l1.val < l2.val) {
// 如果l1的值小于l2的值,那么用l1的下一个节点和l2对比,如此递归
l1.next = mergeTwoLists(l1.next, l2);
// 全都对比完了,最后返回l1(因为l1的头小于l2的头,所以l2已经不存在了,融合在了l1里,下面相同)
return l1;
} else {
l2.next = mergeTwoLists(l1, l2.next);
return l2;
}
}