力扣100——合并两个有序的链表

79 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第17天,点击查看活动详情

力扣100——合并两个有序的链表

题目

刷完100道力扣题之合并两个链表。这在力扣上面是一道简单题,题目大概是需要我们合并两个链表,每个链表自身是按照升序来排列的。我们合并之后返回一个链表,是之前两个链表的合并,并且也是按照升序排列。

思路

写这道题目,我们首先闹钟首先闪过的是排序算法,简单粗暴的方法就是将两个链表合并在一起,然后再对链表进行升序排序。但是这样的时间复杂度显而易见会很高,我们需要对其进行优化。我们知道,能用迭代的我们都可以使用递归来解决,这里我们需要使用的就是递归。

递归首先需要设定递归的结束条件,如果没有递归条件,我们的递归将会递归地狱。我们知道,链表的最后一个next指向null,因此我们需要在递归到最后一个链表节点的时候退出递归。


//当list1为null的时候,表示list1已经递归完成了,我们需要返回list2
if(list1 === null){
    return list2;
}

//当list2为null的时候,表示list2已经递归完成了,我们需要返回list1
if(list2 === null){
    return list1;
}

上面我们对两个链表进行了判断,当list1null的时候,表示list1已经被迭代完成了,接下来我们需要将list2返回。同理,如果list2null我们需要将list2返回。

接下来我们要对list1list2val进行对比。

首先,我们先找出最小的那个节点,因为两个链表都是升序排列,所以两个链表的第一个节点都是链表当中最小的节点。所以我们比较一下list1.vallist2.val

//比较两个链表的节点大小
if(list1.val < list2.val){
    //假如list1.val小于list2.val,那么我们可以得知链表的最小的一个节点为list1.val,之后我们再比较就只需要将结果放在这个节点之后就可以了
    list1.next = mergeTwoLists(list1.next,list2);
    return list1;
}else{
    //list2.val小于或等于list1.val,那么我们可以得知链表的最小的一个节点为list2.val,之后我们再比较就只需要将结果放在这个节点之后就可以了
    list2.next = mergeTwoLists(list1,list2.next);
    return list2;
}

之后,我们通过递归所有的链表节点就可以得到一个升序的链表了。

实现

/**
 * 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) {
    if(list1 === null){
        return list2;
    }

    if(list2 === null){
        return list1;
    }

    //判断val的大小
    if(list1.val < list2.val){
        list1.next = mergeTwoLists(list1.next,list2);
        return list1;
    }else{
        list2.next = mergeTwoLists(list1,list2.next);
        return list2;
    }
};

const list1 = {
    val:1,
    next:{
        val:2,
        next:{
            val:3,
            next:null,
        }
    }
}

const list2 = {
    val:1,
    next:{
        val:5,
        next:{
            val:7,
            next:null,
        }
    }
}

console.log(mergeTwoLists(list1,list2));