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

合并k个已排序的链表

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

/**
 * struct ListNode {
 *  int val;
 *  struct ListNode *next;
 *  ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param lists ListNode类vector
     * @return ListNode类
     */
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        // 创建一个最小堆(优先队列),用于存储所有链表的当前节点
        auto cmp = [](ListNode * a, ListNode * b) {
            return a->val > b->val;
        }; // 返回true时代表第二个参数的优先级大于第一个参数的优先级
        priority_queue<ListNode*, vector<ListNode*>, decltype(cmp)> pq(cmp);

        // 遍历所有链表的头节点,将它们加入最小堆
        for (ListNode* list : lists) {
            if (list != nullptr) {  // 进队前要检查是否为空
                pq.push(list);
            }
        }

        // 创建一个哑节点作为结果链表的头节点
        ListNode dummy(0);
        ListNode* curr = &dummy;

        // 当最小堆不为空时,取出堆顶元素,将其加入结果链表,并将其下一个节点加入最小堆
        while (!pq.empty()) {
            ListNode* node = pq.top();
            pq.pop();
            curr->next = node;
            curr = curr->next;
            if (node->next != nullptr) {
                pq.push(node->next);
            }
        }

        return dummy.next;
    }
};


// 总体思路是将链表的第一个节点压入优先队列,每次提出最小的结点,然后再把下一个节点压入优先队列

数据结构练习 文章被收录于专栏

数据结构练习

全部评论

相关推荐

点赞 评论 收藏
分享
一颗宏心:华为HR晚上过了十二点后还给我法消息。
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务