027合并两个有序链表

合并两个有序链表

题目链接:https://leetcode.cn/problems/merge-two-sorted-lists/description/?envType=study-plan-v2\&envId=top-100-liked

我的解答:

复制代码
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
    if(list1==null){
        return list2;
    }
    if(list2==null){
        return list1;
    }
    ListNode head, cur;
    if(list1.val<=list2.val){
        head=list1;
        list1=list1.next;
    }
    else{
        head=list2;
        list2=list2.next;
    }
    cur=head;
    while(list1!=null&&list2!=null){
        if(list1.val<=list2.val){
            cur.next=list1;
            list1=list1.next;
        }
        else{
            cur.next=list2;
            list2=list2.next;
        }
        cur=cur.next;
    }
    if(list1==null){
        cur.next=list2;
    }
    else{
        cur.next=list1;
    }
    return head;
}

分析:代码的时间复杂度为O(n),空间复杂度为O(1)。解题思路:比较两个链表当前节点,谁当前节点的值小就让新链表的末尾节点连接谁,然后新链表和节点值更小的链表均向后移动一步,重复此过程,直到两个链表任意一个遍历到null,最后将另一个未遍历到空的链表剩余节点连接到新链表的末尾即可。

看了官方题解后的解答:

复制代码
//方法一:递归
//时间复杂度:O(n+m)
//空间复杂度:O(n+m)
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
    if(list1==null){
        return list2;
    }
    if(list2==null){
        return list1;
    }
    if(list1.val<list2.val){
        list1.next = mergeTwoLists(list1.next,list2);
        return list1;
    }
    else{
        list2.next = mergeTwoLists(list1,list2.next);
        return list2;
    }
}

//方法二:迭代
//时间复杂度:O(n+m)
//空间复杂度:O(1)
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
    ListNode prehead = new ListNode(-1);
    ListNode prev = prehead;
    while(list1!=null&&list2!=null){
        if(list1.val<=list2.val){
            prev.next=list1;
            list1=list1.next;
        }
        else{
            prev.next=list2;
            list2=list2.next;
        }
        prev=prev.next;
    }
    prev.next = list1==null ? list2 : list1;
    return prehead.next;
}

分析:

​ 1、方法一采用递归,每次递归返回当前两个节点中值更小的那个节点,直到某一个链表遍历到null为止。

​ 2、方法二采用迭代,先new一个哨兵节点,方便最后答案的返回,每次比较两个链表的头节点,将值更小的那个头节点连接到新节点末尾,直到某个节点遍历到null位置,最后将未遍历到null的节点连接到新节点之后返回即可。

​ 3、我的解题思路与官方题解的方法二一致,只不过我没有哨兵节点,而是在一开始单独比较两个链表头节点值的大小,确定出新链表的头节点。

总结

  • 本题较为简单,只需要不断比较两个链表头节点值的大小,并将值更小的节点连接到新链表的末尾即可。
相关推荐
H.莓飛11 小时前
【数据结构】栈_OJ题
linux·数据结构·算法·centos
Zootopia62611 小时前
多架 eVTOL集群排班调度方案思考
人工智能·算法·数学建模·matlab·动态规划·无人机·evtol
ZealSinger11 小时前
Spring7 RestTemplate弃用迁移
java·spring·后端开发·restclient
和裕11 小时前
年度框架直供 vs 零散按需采购:定制纸箱采购成本、交付与服务核心区别全对比
大数据·运维·网络·人工智能·算法
朝朝辞暮i11 小时前
C++ 第 13 课:值传递 —— 为什么函数里改了,外面却没变?
java·c++·算法
弹简特11 小时前
【Java项目-企悦抽】16-抽奖模块01-获取活动完整信息接口实现
java·开发语言·状态模式·springboot
淡海水12 小时前
02-02-原理篇-分代GC
算法·unity·c#·游戏引擎·.net·gc
平行侠12 小时前
065 B树(B-Tree)
数据结构·b树·树查找
泡茶喝茶写代码12 小时前
A股量化数据工程:从 REST 接口到策略信号(第 1 篇):指数列表与实时行情接入
java·python·股票数据api·股票数据·股票数据api接口·股票api数据接口·股票量化数据接口
Sarvartha12 小时前
接口基础知识
java·开发语言