堆:基础

2021-10-11 每日一题 LeetCode

# 0023. 合并K个升序链表 (opens new window)

题目

给你一个链表数组,每个链表都已经按升序排列。

请你将所有链表合并到一个升序链表中,返回合并后的链表。

解析

本题与 0021. 合并两个有序链表 思路类似,都是找到剩余链表中最小的数字插入结果,不同的是,本题使用一个小根堆加速这个查找的过程。

代码

/**
 * 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* a, ListNode* b) {
            return a->val > b->val;
        }
    };

    ListNode* mergeKLists(vector<ListNode*>& lists) {
        priority_queue<ListNode*, vector<ListNode*>, Cmp> heap;
        for (int i = 0; i < lists.size(); i++) {
            if (lists[i]) heap.push(lists[i]);
        }
        ListNode *dummy = new ListNode(0), *cur = dummy;
        while (!heap.empty()) {
            ListNode* top = heap.top(); heap.pop();
            cur = cur->next = top;
            if (top->next) heap.push(top->next);
        }
        return dummy->next;
    }
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

# 0215. 数组中的第K个最大元素 (opens new window)

题目

解析

代码

# 0218. 天际线问题 (opens new window)

题目

解析

代码

# 0295. 数据流的中位数 (opens new window)

题目

解析

代码

# 0313. 超级丑数 (opens new window)

题目

解析

代码

# 0347. 前 K 个高频元素 (opens new window)

题目

解析

代码

# 0358. K 距离间隔重排字符串 (opens new window)

题目

解析

代码

# 0373. 查找和最小的K对数字 (opens new window)

题目

解析

代码

# 0378. 有序矩阵中第 K 小的元素 (opens new window)

题目

解析

代码

# 0502. IPO (opens new window)

题目

解析

代码

Last Updated: 2023-01-28 4:31:25