首页 > 其他分享 >leetcode 21. 合并两个有序链表 js实现

leetcode 21. 合并两个有序链表 js实现

时间:2022-11-25 00:34:05浏览次数:65  
标签:21 val 复杂度 list1 js next 链表 list2

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

示例 1:

输入: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 均按 非递减顺序 排列

原题

/**
 * 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}
 */
// 迭代
// 时间复杂度:O(n+m),其中 n 和 m 分别为两个链表的长度。因为每次调用递归都会去掉 l1 或者 l2 的头节点(直到至少有一个链表为空),函数 mergeTwoList 至多只会递归调用每个节点一次。因此,时间复杂度取决于合并后的链表长度,即 O(n+m)
// 空间复杂度:O(n+m),其中 n 和 m 分别为两个链表的长度。递归调用 mergeTwoLists 函数时需要消耗栈空间,栈空间的大小取决于递归调用的深度。结束递归调用时 mergeTwoLists 函数最多调用 n+m 次,因此空间复杂度为 O(n+m)。
var mergeTwoLists = function(list1, list2) {
    if(!list1){
        return list2
    }
    if(!list2){
        return list1
    }
    // 定义一个空的链表
    let res = new ListNode(-1);
    // 复制该链表,因为迭代过程中会改变链表
    let ans = res;
    // 迭代结束条件为当一个链表遍历结束即停止
    while(list1&&list2){
        // 当list1节点大,则先指向list2 节点
        if(list1.val>=list2.val){
            res.next = list2;
            // 同时改变 list2 指针为下一个继续对比
            list2 = list2.next;
        }else{
            res.next = list1;
            list1 = list1.next;
        }
        // 每次迭代,改变当前链表的指向,以进行正确指向
        res = res.next;
    }
    // 最后迭代结束后,可能会有一个链表还有剩余,且由于是递增的,所以直接等于剩余的链表头节点即可
    res.next = list1?list1:list2;
    // 返回空节点的下一个即为最终的结果
    return ans.next;
};
// 递归  
// 空间复杂度:O(1)。我们只需要常数的空间存放若干变量
// 时间复杂度:O(n+m),其中 n 和 m 分别为两个链表的长度。因为每次循环迭代中,l1 和 l2 只有一个元素会被放进合并链表中, 因此 while 循环的次数不会超过两个链表的长度之和。所有其他操作的时间复杂度都是常数级别的,因此总的时间复杂度为 O(n+m)。
var mergeTwoLists = function(list1, list2) {
    // 递归结束条件,当一个链表为null时,直接返回另一个
    if(!list1){
        return list2
    }
    if(!list2){
        return list1
    }
    // 如果 list1 链表当前节点值小于 list2.val
    if(list1.val<=list2.val){
        // 则将 list1的下一个指向 list2,list2 的下一个指向 list1.next
        list1.next = mergeTwoLists(list2,list1.next);
        //  最终返回 list1
        return list1;
    }else{
         // 如果 list2 链表当前节点值小于 list1.val
         // 则将 list2的下一个指向 list1,list1 的下一个指向 list2.next
        list2.next = mergeTwoLists(list1,list2.next);
         //  最终返回 list2
        return list2;
    }
};

 

标签:21,val,复杂度,list1,js,next,链表,list2
From: https://www.cnblogs.com/beileixinqing/p/16923943.html

相关文章

  • Bot in Discord with discord.js (12)
    BotinDiscordwithdiscord.js(12)Chapter13-交互四大组件之:上下文菜单ContextMenu上下文菜单(ContextMenu),又称为AppCommand。使用它,不需要用户显式的输入斜杠......
  • leetcode 19. 删除链表的倒数第 N 个结点 js实现
    给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。示例1:输入:head=[1,2,3,4,5],n=2输出:[1,2,3,5]示例2:输入:head=[1],n=1输出:[]示例3:......
  • 算法5: LeetCode_单链表_两数相加
    题目:*给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。*请你将两个数相加,并以相同形式返回一个......
  • 20221124
    为什么越来越有种感觉,最终肯定会分开.如果知道结局,还有必要继续下去吗?两个人都没问题。那问题出在哪呢?我太喜欢吃醋了,又是对谁都很活泼开朗的,如果一开始就不认识还好,......
  • JS的函数式编程范式
    一、认识函数式编程为什么学习函数式编程?学吧,不学干啥,js太原始了,得接收新事物,就很帅,里面的概念,学的晕乎乎,最直观的感受就是,套娃函数式编程是随着React的流行受到关注的......
  • 在WPF中使用JSON(Lottie)动画
    摘要Lottie是Airbnb开源的一个面向iOS、Android、ReactNative的动画库,能分析AdobeAfterEffects导出的动画,并且能让原生App像使用静态素材一样使用这些动画,完美......
  • 使用html2canvas和jspdf将页面保存位pdf
    使用html2canvas和jspdf将页面保存位pdf<scriptsrc="https://unpkg.com/jspdf@latest/dist/jspdf.umd.min.js"></script><scriptsrc="https://unpkg.com/html2canvas@......
  • freertos-刘火良:延时列表(链表)
    前面几章的学习中,任务从创建后一直位于就绪列表中,延时、优先级等操作全部在就绪列表进行,这是不太方便的。根据任务的几个状态知,还需要一个延时列表,当任务进入延时状态时,则......
  • Node.js之微信授权登录和获取微信用户信息
    作者:迷彩摘要微信公众号H5授权登录是比较常见的功能,在开发H5的时候,基本都有微信授权登录的需求,今天我们来看下通过Node.js如何实现微信授权登录申请测试微信公众号测试微信......
  • JWT(JSON Web Token)介绍与实践
    作者:迷彩JWT(JSONWebToken)介绍与实践JWT介绍Jsonwebtoken(JWT),根据官网的定义,是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC7519).该toke......