将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 

示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-two-sorted-lists

昨天看到了这道题,于是选择先去将设计链表的题做掉了。

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
var mergeTwoLists = function (l1, l2) {
    //声明一个节点
    var head = new ListNode(-1);
    //声明一个中间节点
    var flag = head;
    //当两个链表都不为空的时候,进行循环
    while (l1 != null && l2 != null) {
    //判断两个链表第一个节点的大小
        if (l1.val <= l2.val) {
    //将中间节点的next指向第一个节点比较小的链表
            flag.next = l1;
    //将l1链表向后移动一个节点,也就是把第一个节点切割出去了。因为第一个节点符合条件已经不需要循环判断了
            l1 = l1.next;
        } else {
    //整体思路和上一个分支一致
            flag.next = l2;
            l2 = l2.next;
        }
    //判断之后将中间节点向后移动一位
        flag = flag.next;
    }
    //如果某个链表为null 则直接将flag.next指向另一个链表
    flag.next = l1 ? l1 : l2;
    //返回head节点的next。
    return head.next;
};

这道题还有一种递归的解法,真的是太简洁了
因为这个字体小写L和数字1长得实在太像了,我给改成大写的了。

/**
* Definition for singly-linked list.
* function ListNode(val) {
*     this.val = val;
*     this.next = null;
* }
*/
/**
* @param {ListNode} L1
* @param {ListNode} L2
* @return {ListNode}
*/
var mergeTwoLists = function(L1, L2) {
    if(L1 == null){
        return L2;
    }
    if(L2 == null){
        return L1;
    }
    if(L1.val <= L2.val){
        L1.next = mergeTwoLists(L1.next,L2);
        return L1;
    }else{
        L2.next = mergeTwoLists(L1,L2.next);
        return L2;
    }
}