Stay Hungry,Stay Foolish!

23. 合并 K 个升序链表

23. 合并 K 个升序链表

https://leetcode.cn/problems/merge-k-sorted-lists/?envType=study-plan-v2&envId=top-interview-150

 

思路

K个升序链表,依据显然的规则:

当前最小的值,肯定出自于K个升序链表的K个表头中,

对这K个表头使用最小堆(priority_queue)进行管理,pop出的堆顶值,就是当前最小值

剩下 K-1 表头在堆中, 将 当前最小值所有链表 的 第二小 元素 入堆,

继续求第二小值

。。。。。。

 

Code

/**
 * 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 QNODE{
    int val;
    ListNode* node;
    bool operator < (const QNODE &qnode) const{
        return val > qnode.val;
    }
};

class Solution {
public:
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        priority_queue <QNODE> pq;

        for(auto one: lists){
            if (one){
                pq.push({one->val, one});
            }
        }

        ListNode head, *tail = &head;

        while(!pq.empty()){
            QNODE top = pq.top();
            pq.pop();

            tail->next = top.node;
            tail = tail->next;

            if (top.node->next){
                pq.push({top.node->next->val, top.node->next});
            }
        }

        return head.next;
    }
};

 

 

优先队列

https://zhuanlan.zhihu.com/p/355974733

https://www.cnblogs.com/shona/p/12163381.html

 

注意最小堆和最大堆的原型差异

 //升序队列  小顶堆 great 小到大
 priority_queue <int,vector<int>,greater<int> > pq;//升序
 //降序队列  大顶堆 less  大到小 默认
 priority_queue <int,vector<int>,less<int> > pq;//降序

 

 

 
posted @ 2024-05-08 19:59  lightsong  阅读(1)  评论(0编辑  收藏  举报
Life Is Short, We Need Ship To Travel