跳至主要內容

合并两个有序链表

Mr.He小于 1 分钟

合并两个有序链表

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

示例
示例
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]

列表节点

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */

代码实现

/**
 * @param {ListNode} list1
 * @param {ListNode} list2
 * @return {ListNode}
 */
var mergeTwoLists = function(list1, list2) {
    function traverse(list1, list2){
        if(list1 === null) return list2
        if(list2 === null) return list1
        let list;          // 定义一个节点,将较小值赋给此节点
        if(list1.val < list2.val){
            list = list1
            list.next = traverse(list1.next, list2) // 将赋值后的节点的下个节点,和未赋值的节点放入递归
        }else{
            list = list2
            list.next = traverse(list1, list2.next)
        }
        return list
    }
    return traverse(list1, list2)
};

虚拟头节点

/**
 * @param {ListNode} list1
 * @param {ListNode} list2
 * @return {ListNode}
 */
var mergeTwoLists = function(list1, list2) {
    let head = new ListNode() // 设计一个虚拟的头节点,返回的时候将头节点的next返回即可
    let p1 = list1, p2 = list2, p = head
    while(p1 !== null && p2 !== null){
        if(p1.val < p2.val){
            p.next = p1
            p1 = p1.next
        }else{
            p.next = p2
            p2 = p2.next
        }
        p = p.next
    }
    if(p1 === null) p.next = p2
    if(p2 === null) p.next = p1
    return head.next
};