大家好,我是开车的阿Q,自动驾驶的时代已经到来,没时间解释了,快和阿Q一起上车。作为自动驾驶系统工程师,必须要有最好的C++基础,让我们来一起刷题吧。
题目考察的知识点
这道题目考察了合并多个有序链表,可以使用优先队列(最小堆)来解决。
题目解答方法的文字分析
我们可以使用最小堆来合并多个有序链表。具体操作可以分为以下步骤:
- 创建一个最小堆,将每个链表的头结点插入堆中。
- 从堆中弹出最小的节点,将其加入到合并后的链表中,并将该节点的下一个节点插入堆中。
- 重复上述步骤,直到堆为空。
本题解析所用的编程语言
本题解析所用的编程语言为C++。
完整且正确的编程代码
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) : val(x), next(nullptr) {}
* };
*/
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param lists ListNode类vector
* @return ListNode类
*/
struct Compare {
bool operator()(const ListNode* a, const ListNode* b) {
return a->val > b->val;
}
};
ListNode* mergeKLists(vector<ListNode*>& lists) {
// 创建一个最小堆,用于按照节点的值升序存储链表节点
priority_queue<ListNode*, vector<ListNode*>, Compare> pq;
// 将每个链表的头结点插入堆中
for (auto list : lists) {
if (list) {
pq.push(list);
}
}
// 创建虚拟头节点,方便构建合并后的链表
ListNode* dummy = new ListNode(0);
ListNode* current = dummy;
// 从堆中不断弹出最小的节点,将其连接到合并链表中
while (!pq.empty()) {
ListNode* node = pq.top();
pq.pop();
current->next = node;
current = current->next;
// 将弹出节点的下一个节点插入堆中
if (node->next) {
pq.push(node->next);
}
}
return dummy->next;
}
};
在这个代码中,我们使用优先队列(最小堆)来合并多个有序链表,从堆中弹出最小的节点,然后将其下一个节点插入堆中。最终得到合并后的有序链表。
您的关注、点赞、收藏就是我创作的动力,三连支持阿Q!

京公网安备 11010502036488号