【剑斩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;
    }
};
相关推荐
aramae6 小时前
MySQL复合查询(8)
java·c语言·开发语言·后端·算法
荆棘鸟智能6 小时前
城市感知设备怎么统一接入?从多协议网关到设备模型的中间件架构设计
人工智能·算法·边缘计算
INGNIGHT10 小时前
270 · 电话号码的字母组合II(Trie)
linux·算法
2401_8390805411 小时前
C++常见八股
数据结构·c++·算法
青山是哪个青山11 小时前
LeetCode 188:买卖股票的最佳时机 IV
算法
mikuyyds11 小时前
geo-toolbox 插件算法解析:RUSLE 与 MUSLE 的工程化落地
算法·rust·gis
Tisfy11 小时前
LeetCode 3498.字符串的反转度:一次遍历
leetcode·字符串·题解·遍历
a1879272183111 小时前
【算法】树(二):队列与祖先——BFS 骨架三配件、短路透传与合流
算法·leetcode·二叉树··bfs·算法讲解·树遍历
syagain_zsx12 小时前
算法基础篇 · 03 枚举(C++ 题解)
c++·算法·二进制·枚举
weixin_3077791312 小时前
C++代码实现MATLAB中的ode23tb函数功能
开发语言·c++·算法·matlab