【剑斩OFFER】算法的暴力美学——合并 k 个升序链表

一、题目描述

二、算法原理

思路:最小堆

1)首先弄出这样的堆,这个堆里面的结点保存的是每个链表的地址

2)每次拿出堆顶的结点,这个结点就是这么多个链表里面里面的最小值的结点

3)把堆顶的元素出堆

4)如果这个拿出堆顶的结点还有下一个结点,也就是说这个结点的下一个结点不为 nullptr ,则再把这个结点的下一个结点入堆。

5)重复上面的操作,直到这个堆为空

三、代码实现

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) {}
 * };
 */
struct CampareNode//自定义最小堆的比较函数
{
    bool operator()(ListNode* x,ListNode* y)
    {
        return x->val > y->val;
    }
};

class Solution {
public:
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        //初始化最小堆
        priority_queue<ListNode*,vector<ListNode*>,CampareNode> minheap;
        //把所有链表入堆
        for(auto& e : lists) if(e) minheap.push(e);
        //自定义一个链表
        ListNode* head = new ListNode(0);//哨兵结点
        ListNode* cur = head;
        while(minheap.size())
        {
            ListNode* tmp = minheap.top();//获取堆顶元素
            minheap.pop();//出堆
            cur->next = tmp;
            cur = tmp;
            if(tmp->next) minheap.push(tmp->next);
        }
        cur->next = nullptr;
        ListNode* result = head->next;
        delete head;//释放哨兵结点
        return result;
    }
};
相关推荐
NAGNIP11 小时前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
颜酱19 小时前
单调栈:从模板到实战
javascript·后端·算法
CoovallyAIHub1 天前
仿生学突破:SILD模型如何让无人机在电力线迷宫中发现“隐形威胁”
深度学习·算法·计算机视觉
CoovallyAIHub1 天前
从春晚机器人到零样本革命:YOLO26-Pose姿态估计实战指南
深度学习·算法·计算机视觉
CoovallyAIHub1 天前
Le-DETR:省80%预训练数据,这个实时检测Transformer刷新SOTA|Georgia Tech & 北交大
深度学习·算法·计算机视觉
CoovallyAIHub1 天前
强化学习凭什么比监督学习更聪明?RL的“聪明”并非来自算法,而是因为它学会了“挑食”
深度学习·算法·计算机视觉
CoovallyAIHub1 天前
YOLO-IOD深度解析:打破实时增量目标检测的三重知识冲突
深度学习·算法·计算机视觉
NAGNIP1 天前
轻松搞懂全连接神经网络结构!
人工智能·算法·面试
NAGNIP1 天前
一文搞懂激活函数!
算法·面试
董董灿是个攻城狮1 天前
AI 视觉连载7:传统 CV 之高斯滤波实战
算法