LeetCode 23.合并K个升序链表

该博客介绍了一个利用优先队列(最小堆)高效地合并多个已排序链表的算法。通过自定义比较函数,确保堆顶始终是最小的链表节点,从而实现合并过程。代码中创建了一个`cmp`结构体,用于定义比较规则,并在`mergeKLists`函数中实现了合并操作。
摘要由CSDN通过智能技术生成

主页有其他数据结构内容(持续更新中)

难度:Hard

代码:

用优先队列可以很好地解决此类问题

/**
 * 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:
    struct cmp{
        //  重写仿函数
        bool operator()(ListNode* l1, ListNode* l2){
            return l1->val > l2->val; 
            //  这里用>的含义:如果l1->val>l2->val(返回true),那么就进行下沉操作;返回false就不改变
            //  我们的目标是建立一个头部最小的堆
            //  优先队列的源码使用数组实现,array[0]是堆顶,必须使大的数不断下沉
            //  根据所有链表的头结点的比较结果,可以确保优先队列的队头是最小的
        }
    };

    ListNode* mergeKLists(vector<ListNode*>& lists) {
        priority_queue<ListNode*, vector<ListNode*>, cmp> pq;
        for(ListNode* temp : lists){
            if(temp){
                pq.push(temp);
            }
        }
        //  new一个头节点
        ListNode* dummy = new ListNode();
        ListNode* current = dummy;
        while(!pq.empty()){
            current->next = pq.top();   //  指向当前队列顶部结点,也就是最小元素
            pq.pop();   //  把当前结点出队
            current = current->next;
            if(current->next){
                //  如果当前结点存在后继结点,使之入队,继续完成后续比较
                pq.push(current->next);
                //  每次在插入新结点之后,priority_queue都会按照排序规则自动进行一次排序
            }
        }
        return dummy->next;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值