leetcode之hot100---21合并两个有序链表(C++)

思路一:暴力解法

分别遍历两个链表,不断比较节点大小,将较小的放入新链表

cpp 复制代码
/**
 * 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* list1, ListNode* list2) {
        //声明一个新链表的哨兵节点,并初始化其值为-1,其后继为空
        ListNode* list3 = new ListNode(-1);
        //构建三个指针分别指向链表1、链表2、新链表
        ListNode* p1 = list1;
        ListNode* p2 = list2;
        ListNode* p3 = list3;
        //当两链表均未遍历完,继续合并
        while(p1 != nullptr && p2 != nullptr){
            //将较小值优先放入新链表中
            if(p1->val < p2->val){
                p3->next = p1;
                p1 = p1->next;
            }
            else{
                p3->next = p2;
                p2 = p2->next;
            }
            p3 = p3->next;
        }
        //将还未遍历完的链表直接与新链表的尾部连接起来
        if(p1 != nullptr){
            p3->next = p1;
        }
        if(p2 != nullptr){
            p3->next = p2;
        }
        //返回新链表头结点的后继
        return list3->next;
    }
};
  • 时间复杂度:O(n+m)
  • 空间复杂度:O(1)

思路二:递归

cpp 复制代码
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 {
            l2->next = mergeTwoLists(l1, l2->next);
            return l2;
        }
    }
};
  • 时间复杂度:O(n+m)
  • 空间复杂度:O(n+m)
相关推荐
普贤莲花5 分钟前
【2026年第18周---写于20260501】---舍得
程序人生·算法·leetcode
m0_6294947321 分钟前
LeetCode 热题 100-----16.除了自身以外数组的乘积
数据结构·算法·leetcode
晚风吹红霞28 分钟前
C++异常处理核心知识点全解析
开发语言·c++
CoderCodingNo29 分钟前
【信奥业余科普】C++ 的奇妙之旅 | 17:面的铺展与文本的本质——二维数组与字符串
开发语言·c++
迷途之人不知返1 小时前
优先级队列:priority_queue
数据结构·c++
曦夜日长1 小时前
C++ STL容器string(一):string的变量细节、默认函数的认识以及常用接口的使用
java·开发语言·c++
代码中介商1 小时前
C++ STL 标准模板库完全指南:从容器到迭代器
开发语言·c++·stl
winner88811 小时前
C++ 构造函数、析构函数、虚函数、虚析构
开发语言·c++
想唱rap1 小时前
应用层协议与序列化
linux·运维·服务器·网络·数据结构·c++·算法
许长安1 小时前
protobuf 使用详解
c++·经验分享·笔记·中间件