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)

相关推荐
用户8055336980320 小时前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
To_OC1 天前
LC 207 课程表:刚学图论那会儿,我连这是拓扑排序都没看出来
javascript·算法·leetcode
To_OC1 天前
LC 208 实现 Trie 前缀树:曾被名字劝退,写完发现是送分题
javascript·算法·leetcode
BadBadBad__AK1 天前
线段树维护区间 k 次方和
c++·数学·算法·stl
卷无止境2 天前
Eigen 库如何借助 OpenMP 加速计算
c++·后端
卷无止境2 天前
OpenMPI、MPICH 与 OpenMP:关系、核心概念与架构全解
c++·后端
To_OC2 天前
LC 994 腐烂的橘子:人人都说是 BFS 入门题,我却写了三遍才过
javascript·算法·leetcode
To_OC3 天前
LC 200 岛屿数量:经典 DFS 入门题,我第一次写居然连方向都搞错了
javascript·算法·leetcode
郝学胜_神的一滴3 天前
CMake 30:循环语法全解|foreach_while双循环精讲、迭代技巧与实战避坑指南
c++·cmake
To_OC3 天前
LC 128 最长连续序列:别上来就排序,O (n) 解法才是这题的灵魂
javascript·算法·leetcode