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)

相关推荐
祁同伟.43 分钟前
【C++】多态
开发语言·c++
rechol43 分钟前
C++ 继承笔记
java·c++·笔记
SunkingYang2 小时前
详细介绍C++中捕获异常类型的方式有哪些,分别用于哪些情形,哪些异常捕获可用于通过OLE操作excel异常
c++·excel·mfc·异常捕获·comerror
while(1){yan}2 小时前
数据结构之链表
数据结构·链表
Han.miracle4 小时前
数据结构——二叉树的从前序与中序遍历序列构造二叉树
java·数据结构·学习·算法·leetcode
北冥湖畔的燕雀5 小时前
C++泛型编程(函数模板以及类模板)
开发语言·c++
独自破碎E6 小时前
判断链表是否为回文
数据结构·链表
Larry_Yanan9 小时前
QML学习笔记(四十二)QML的MessageDialog
c++·笔记·qt·学习·ui
R-G-B9 小时前
【35】MFC入门到精通——MFC运行 不显示对话框 MFC界面不显示
c++·mfc·mfc运行 不显界面·mfc界面不显示
Madison-No710 小时前
【C++】探秘vector的底层实现
java·c++·算法