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;
    }
};

结果

相关推荐
帅小伙―苏4 分钟前
力扣42接雨水
前端·算法·leetcode
AI科技星20 分钟前
精细结构常数α的几何本源:从第一性原理的求导证明、量纲分析与全域验证
算法·机器学习·数学建模·数据挖掘·量子计算
6Hzlia26 分钟前
【Hot 100 刷题计划】 LeetCode 287. 寻找重复数 | C++ 数组判环 (快慢指针终极解法)
c++·算法·leetcode
MegaDataFlowers26 分钟前
26.删除有序数组中的重复项
算法
故事和你912 小时前
洛谷-数据结构1-4-图的基本应用2
开发语言·数据结构·算法·深度优先·动态规划·图论
吴可可1232 小时前
C#合并首尾相连多段线实战
算法·c#
KMDxiaozuanfeng3 小时前
卡梅德生物技术快报|SPR 技术应用|基于 SPR 亲和力的中药活性成分筛选系统实现与数据分析
科技·算法·面试·考试
꧁细听勿语情꧂3 小时前
数据结构概念和算法、时间复杂度、空间复杂度引入
c语言·开发语言·数据结构·算法
Felven3 小时前
B. The 67th 6-7 Integer Problem
数据结构·算法
玉树临风ives3 小时前
atcoder ABC 454 题解
算法·深度优先·图论