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

结果

相关推荐
ASKED_20192 小时前
企业级大模型微调(Fine-tuning)策略
大数据·人工智能·算法
圣保罗的大教堂2 小时前
leetcode 3713. 最长的平衡子串 I 中等
leetcode
t198751282 小时前
基于Chirp分解和多相快速算法的离散分数傅里叶变换(DFRFT)MATLAB实现
开发语言·算法·matlab
愚者游世2 小时前
力扣解决二进制 | 题型常用知识点梳理
c++·程序人生·算法·leetcode·职场和发展
阿星AI工作室3 小时前
宝藏skills!90个顶尖博客信源自动抓,AI每天帮我筛出20篇精华!
人工智能·算法
程序员酥皮蛋3 小时前
hot 100 第二十四题 24.回文链表
数据结构·链表
Ulyanov3 小时前
基于Python的单脉冲雷达导引头回波生成技术
python·算法·仿真·单脉冲雷达、
ersaijun3 小时前
机器人动力学库Pinocchio、RBDL 和 KDL区别
算法·机器人·控制·开源库
sali-tec3 小时前
C# 基于OpenCv的视觉工作流-章25-ORB特征点
图像处理·人工智能·opencv·算法·计算机视觉