LeetCode Hot100 之 16 合并两个有序链表

题目

分析

思路一

用一个multiset来存储<int,ListNode*>类型的多射数据,以此来存储这些节点的信息。然后遍历这个multiset来重建链表。

代码

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) {
       // 使用 multiset,让 std::less 自动处理 pair<int, ListNode*> 的比较
        multiset<pair<int, ListNode*>> nodes;

        // 遍历 list1
        ListNode* curr = list1;
        while (curr != nullptr) {
            nodes.insert({curr->val, curr});
            curr = curr->next;
        }

        // 遍历 list2
        curr = list2;
        while (curr != nullptr) {
            nodes.insert({curr->val, curr});
            curr = curr->next;
        }

        if (nodes.empty()) {
            return nullptr;
        }

        // 构建新链表
        auto it = nodes.begin();
        ListNode* head = it->second;
        ListNode* tail = head;
        ++it;

        for (; it != nodes.end(); ++it) {
            tail->next = it->second;
            tail = tail->next;
        }
        tail->next = nullptr; // 最后一个节点的 next 设置为空

        return head;
    }
};

结果

思路二

利用两个指针,分别指向list1和list2的节点,然后继续比较,将两者之中较小的接到后面,然后移动指针,直到两条链都被遍历完。

代码

cpp 复制代码
class Solution {
public:
    ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
        // 创建一个虚拟头节点,简化边界处理
        ListNode dummy;
        ListNode* tail = &dummy; // 尾指针,用于构建新链表

        // 当两个链表都还有节点时,比较节点值,将较小的接到结果链表后面
        while(list1 != nullptr && list2 != nullptr) {
            if(list1->val <= list2->val) {
                tail->next = list1;
                list1 = list1->next;
            } else {
                tail->next = list2;
                list2 = list2->next;
            }
            tail = tail->next; // 移动尾指针
        }

        // 将剩余的非空链表直接接到结果链表末尾
        if(list1 != nullptr) {
            tail->next = list1;
        } else {
            tail->next = list2;
        }

        // 返回真正的头节点
        return dummy.next;
    }
};

结果

相关推荐
怕浪猫2 小时前
RAG 面试 6 连问,从原理到优化全部覆盖
python·算法·面试
无线通信科研笔记2 小时前
IEEE TVT 2026 论文精读与完整复现|相位误差如何重塑近场 RIS 的幅相响应
论文阅读·人工智能·python·算法·论文笔记
mmmmath_33 小时前
二叉树の递归遍历
算法
All for pursuit.4 小时前
【位运算-1】338.比特位计数
数据结构·c++·算法·leetcode
小师兄吃牛肉4 小时前
C语言中的nullptr有必要吗
c语言·c++·算法
一只小小的芙厨6 小时前
【线性DP】
学习·算法·动态规划
奋发向前wcx6 小时前
CSP-J复赛模拟赛5 王晨旭补题 2026.10.5
算法
罗湖老棍子8 小时前
C Looooops(信息学奥赛一本通- P1640)
算法·数论·同余·裴蜀定理·扩展欧几里得
飘尘10 小时前
从"算子"到"AI Infra":大模型背后看不见的那群人在忙什么
人工智能·算法·面试
夏幻灵11 小时前
每日一题:LeetCode 3:无重复字符的最长子串——滑动窗口思路详解
算法·leetcode·职场和发展