• 算法练习-第二天(合并两个排序的链表)


    业精于勤荒于嬉

    🐧主页详情:旷世奇才李先生主页
    📢作者简介:🏅优质创作者🏅 and 🏅阿里专家博主🏅 and 🏅华为云享专家🏅
    ✍️人生格言:把一生一分为二,前半生不犹豫,后半生不后悔
    🧑‍💻人生目标:做自己想做的
    👻如果觉得博主的文章还不错的话,请三连支持一下博主哦
    💬给大家介绍一个我一直在用的求职刷题收割offe👉点击进入网站


    前言

    对于程序员来说算法属于基本功,掌握了算法就能够写出更高效的代码,所以我们要现在还是进行日常的刷题练习,养兵千日用兵一时,大家一定要多多练习

    大家一定要合理运用好日常的时间来刷题。

    一、合并两个排序的链表

    描述
    输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。

    要求:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)

    如输入{1,3,5},{2,4,6}时,合并后的链表为{1,2,3,4,5,6},所以对应的输出为{1,2,3,4,5,6},

    二、题解

    public class Solution {
        public ListNode Merge(ListNode list1,ListNode list2) {
            // list1 list2为空的情况
            if(list1 == null || list2 == null){
                return list1 != null ? list1 : list2;
            }
            // 两个链表元素依次对比
            if(list1.val <= list2.val){
                // 递归计算 list1.next, list2
                list1.next = Merge(list1.next, list2);
                return list1;
            }else{
                // 递归计算 list1, list2.next
                list2.next = Merge(list1, list2.next);
                return list2;
            } 
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    三、分析

    1、解决方式(递归)

    特殊情况:如果有一个链表为空,返回另一个链表
    如果pHead1 节点值比小pHead2,下一个节点应该是 pHead1,应该return pHead1,在return之前,指定pHead1的下一个节点应该是pHead1.next和pHead2俩链表的合并后的头结点
    如果pHead1 节点值比pHead2大,下一个节点应该是pHead2,应该return pHead2,在return之前,指定pHead2的下一个节点应该是pHead1和pHead2.next俩链表的合并后的头结点

    1、首先是两个链表
    在这里插入图片描述

    2、判断两个链表是否有空链表的情况,如果有空链表的情况直接返回另一个链表即可。

    如果没有空链表的情况就比较两个链表的值

    // 两个链表元素依次对比
            if(list1.val <= list2.val){
                // 递归计算 list1.next, list2
                list1.next = Merge(list1.next, list2);
    
    • 1
    • 2
    • 3
    • 4

    这里如果list1的值小于list2的值,那么list1的next应该指向list1的next和list2比较哪个值更小。

    在这里插入图片描述

    最终合并为一个链表

    在这里插入图片描述

    复杂度分析:
    时间复杂度O(N+M):M N分别表示pHead1, pHead2的长度
    空间复杂度O(N+M):迭代次数占用空间

    2、测试提交

    代码写完了就需要先自测一下,这个时候我们点击自测运行看一看能不能测试通过。

    在这里插入图片描述

    这里我们可以看到自测成功了,那我们就点击保存并提交来提交此题。

    在这里插入图片描述

    提交答案后会显示我们此题的运行时间以及占用内存,并且判断我们这两项超过了其他百分之多少的人,我们还可以点击进入下一题来接着进行刷题,这样会越刷越上瘾的。

    四、总结

    可以微信搜索【小奇JAVA面试】第一时间阅读,回复【资料】获取福利,回复【项目】获取项目源码,回复【简历模板】获取简历模板,回复【学习路线图】获取学习路线图。

  • 相关阅读:
    SQLServer连接表
    CEAC 之《企业信息化管理》1
    3年外包裸辞,面试阿里、字节全都一面挂,哭死.....
    45.120.101.X 如何找出网站建设中弱点和漏洞
    关于组织开展2022年南京市创新产品(第一批)申报工作的通知
    Android统一管理Timer计时器Service工具
    FPGA - 7系列 FPGA内部结构之Clocking -03- 时钟管理模块(CMT)
    【JVM】年轻代进入老年代规整
    ssh secure shell Client连接问题
    Speedoffice(Excel)如何使用Sumifs函数?
  • 原文地址:https://blog.csdn.net/weixin_44096133/article/details/126514874