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

发布于:2022-12-18 ⋅ 阅读:(804) ⋅ 点赞:(0)

业精于勤荒于嬉

🐧主页详情:旷世奇才李先生主页
📢作者简介:🏅优质创作者🏅 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、解决方式(递归)

特殊情况:如果有一个链表为空,返回另一个链表
如果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);

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

在这里插入图片描述

最终合并为一个链表

在这里插入图片描述

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

2、测试提交

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

在这里插入图片描述

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

在这里插入图片描述

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

四、总结

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