Leetcode:合并两个有序链表

题目连接:21. 合并两个有序链表 - 力扣(LeetCode)

优化版本(递归)

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        ListNode* preHead = new ListNode(-1);//合并链表的哨兵位结点

        ListNode* prev = preHead;
        while (l1 != nullptr && l2 != nullptr) 
        {
            if (l1->val < l2->val) 
            {
                prev->next = l1;
                l1 = l1->next;
            }
            else 
            {
                prev->next = l2;
                l2 = l2->next;
            }
            prev = prev->next;
        }

        // 合并后 l1 和 l2 最多只有一个还未被合并完,我们直接将链表末尾指向未合并完的链表即可
        prev->next = l1 == nullptr ? l2 : l1;

        return preHead->next;
    }
};

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

空间复杂度:O(1)

优化版本(递归)

主旨:合并(l1,l2)等价于解决 l1->next = mergeTwoLists(l1->next, l2) 以及l2->next = mergeTwoLists(l1, l2->next)的子问题

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        if (l1 == nullptr) 
        {
            return l2;
        } 
        else if (l2 == nullptr) 
        {
            return l1;
        } 
        else if (l1->val < l2->val) 
        {
            l1->next = mergeTwoLists(l1->next, l2);
            return l1;
        } 
        else//l1->val >= l2->val
        {
            l2->next = mergeTwoLists(l1, l2->next);
            return l2;
        }
    }
};

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

空间复杂度:O(m+n)(其中 n 和 m 分别为两个链表的长度。递归调用 mergeTwoLists 函数时需要消耗栈空间,栈空间的大小取决于递归调用的深度。结束递归调用时 mergeTwoLists 函数最多调用 n+m 次)

~over~

相关推荐

  1. Leetcode合并有序

    2024-06-14 19:52:02       7 阅读
  2. LeetCode [简单]合并有序 (迭代

    2024-06-14 19:52:02       46 阅读
  3. Leetcode21 合并有序

    2024-06-14 19:52:02       36 阅读
  4. Leetcode 21:合并有序

    2024-06-14 19:52:02       32 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-14 19:52:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-14 19:52:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-14 19:52:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-14 19:52:02       18 阅读

热门阅读

  1. ubuntu20.04 minio 安装为服务

    2024-06-14 19:52:02       6 阅读
  2. 查看ubuntu中的分区是什么类型的

    2024-06-14 19:52:02       5 阅读
  3. 矩阵的运算:加减乘除与转置#matlab

    2024-06-14 19:52:02       4 阅读
  4. 数仓SQL如何做code review?

    2024-06-14 19:52:02       6 阅读
  5. 基于大模型的Code Review

    2024-06-14 19:52:02       10 阅读
  6. 力扣第197题:上升的温度

    2024-06-14 19:52:02       6 阅读
  7. Jupyter部署和使用教程

    2024-06-14 19:52:02       8 阅读
  8. 深度学习的点云分类

    2024-06-14 19:52:02       5 阅读
  9. DevOps的原理及应用详解(六)

    2024-06-14 19:52:02       8 阅读