【力扣刷题记 21】——《合并两个有序链表》

116 阅读1分钟

Offer 驾到,掘友接招!我正在参与 2022 春招打卡活动,点击查看活动详情

一、题目描述:

  1. 合并两个有序链表-难度简单

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

 

示例 1:

image.png

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

输出:[1,1,2,3,4,4]

示例 2:

输入:l1 = [], l2 = []

输出:[]

示例 3:

输入:l1 = [], l2 = [0]

输出:[0]  

提示:

两个链表的节点数目范围是 [0, 50]

-100 <= Node.val <= 100

l1 和 l2 均按 非递减顺序 排列

二、题目和思路分析:

链表的合并,看起来没什么难的,所以我的思路是这样的:

合并链表

取两个链表头部最小的那个作为下一个链表

如果其中一个链表为空,直接把另一个链表加进去,结束

递归调用即可

思路看起来没错,写的的时候还是要思考一下回调方法的逻辑。

递归调用到最后,一定有一个链表指向为null,所以本质上是从最后一个val最大的节点开始向前拼接,这样想的话,更容易理解一些。

三、代码:

代码实现如下:

/**
 * 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) {

    return mergeNodes(list1, list2)

    function mergeNodes(list1, list2){
        if(list1 == null){ return list2}
        if(list2 == null){ return list1}
        if(list1.val < list2.val){ // 以list1第一个节点开头
            list1.next = mergeNodes(list1.next, list2)  // 递归调用,返回下一个节点
            return list1
        }else{ // 以list2第一项开头
            list2.next = mergeNodes(list1, list2.next)  // 递归调用,返回下一个节点
            return list2
        }
    }
};

四、总结:

这是今天做的第一道题目,比较简单,无非就是重复调用。

加油吧!