题解 | #合并k个已排序的链表#

合并k个已排序的链表

https://www.nowcoder.com/practice/65cfde9e5b9b4cf2b6bafa5f3ef33fa6

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
#include <functional>
#include <list>
#include <queue>
class Solution {
public:
    ListNode *mergeKLists(vector<ListNode *> &lists) {
        auto cmp = [](ListNode *a, ListNode *b)  {
            return a->val > b->val;
        };
        priority_queue<ListNode *, vector<ListNode *>, decltype(cmp)> pq(cmp);
        for (auto &i: lists) {
            if (i) {
                pq.push(i);
            }
        }
        ListNode *res = nullptr, **ptr = &res;
        while (!pq.empty()) {
            auto now = pq.top();
            pq.pop();
            if (now->next) {
                pq.push(now->next);
            }
            *ptr = now;
            ptr = &((*ptr)->next);
        }
        return res;
    }
};

思路:优先队列。

* 先将所有链表的第一个元素放进去。

* 通过最小堆的性质,获得堆顶节点,也就是最小的节点。

* 该节点的next节点如果不为空,则将其放进堆中。

全部评论

相关推荐

11-28 17:48
中山大学 C++
点赞 评论 收藏
分享
点赞 评论 收藏
分享
头像
11-18 16:08
福州大学 Java
影流之主:干10年不被裁,我就能拿别人一年的钱了,日子有盼头了
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务