leetcode hot100刷题日记——29.合并两个有序链表

解答:

方法一:递归

递归的边界条件是啥呢?

递归别想那么多具体步骤,考虑大步骤,小的递归自己会去做的

cpp 复制代码
class Solution {
public:
    ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
        //递归比较大小
        //先考虑递归边界是什么?
        //如果一条链表遍历到了空节点,说明另一条链表已经排好序了
        //返回另一条链表
        if(!list1){
            return list2;
        }
        if(!list2){
            return list1;
        }
        //如果两条链表都还是非空,说明还在递归过程中
        //如果list1的当前节点值<list2的当前节点值
        // 那么我们应该把递归返回的链表放在list1的后面
        if(list1->val<list2->val){
            list1->next=mergeTwoLists(list1->next,list2);
            return list1;
        }
        //否则,我们就应该把递归返回的链表放在list2的后面
        list2->next=mergeTwoLists(list1,list2->next);
        return list2;
    }
};

时间复杂度:O(n+m)

空间复杂度:O(n+m)

方法二:迭代

参考灵山大大的题解写的

哨兵节点其实就是虚拟头节点

cpp 复制代码
class Solution {
public:
    ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
        ListNode dummy{};
        auto cur=&dummy;
        while(list1&&list2){
            if(list1->val<list2->val){
                cur->next=list1;
                list1=list1->next;
            }else{
                cur->next=list2;
                list2=list2->next;
            }
            cur=cur->next;
        }
        cur->next=list1?list1:list2;
        return dummy.next;
    }
};

时间复杂度:O(n+m)

空间复杂度:O(1)

相关推荐
lsnm18 分钟前
【LINUX网络】网络socet接口的基本使用以及实现简易UDP通信
linux·网络·c++·网络协议·ubuntu·udp·centos
扫地僧9851 小时前
免费1000套编程教学视频资料视频(涉及Java、python、C C++、R语言、PHP C# HTML GO)
java·c++·音视频
青春:一叶知秋1 小时前
【C++开发】CMake构建工具
java·开发语言·c++
程序员弘羽2 小时前
C++ 第二阶段:类与对象 - 第三节:成员函数与访问权限
开发语言·c++
我命由我123452 小时前
C++ - 标准库之 <string> npos(npos 概述、npos 的作用)
服务器·c语言·开发语言·c++·后端·visualstudio·visual studio
秋风&萧瑟2 小时前
【C++】C++枚举、const、static的用法
c++·算法
君鼎2 小时前
C++项目经验与解决问题能力需知
开发语言·c++
玉~你还好吗2 小时前
【LeetCode#第228题】汇总区间(简单题)
算法·leetcode
双叶8363 小时前
(C++)素数的判断(C++教学)(C语言)
c语言·开发语言·数据结构·c++·算法
六bring个六3 小时前
Qthread应用
c++·qt·多线程