【剑斩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;
    }
};
相关推荐
Nebula_g9 分钟前
JavaSE高级:动态代理
java·开发语言·算法·javase
垆边人似月.18 分钟前
华为题:盛最多水的容器
数据结构·算法
怦然丶心动24 分钟前
用 Java 把干支历法算清楚:从节气切年到可读摘要
java·算法·vue·独立开发·spring boot / spring
Zachery Pole36 分钟前
具身智能强化学习(1)引言
算法·机器学习
All for pursuit.37 分钟前
【动态规划-11】279.完全平方数
数据结构·c++·算法·leetcode·动态规划
淡海水44 分钟前
02-06-原理篇-增量式GC与并发GC
算法·unity·c#·并发·gc·增量
对空六课1 小时前
无头浏览器访问对跳出率的过滤规则
服务器·前端·算法·数据分析
有同事要进步1 小时前
leecode第一题-两数字之和(打卡)
算法
程序员清风1 小时前
二叉搜索树:查找、插入与删除
算法
HRTOS1 小时前
HRTOS 内核 BUG 修复:任务等待对象未初始化导致的异常唤醒问题
单片机·嵌入式硬件·算法·51单片机