题解 | #牛群的合并#
牛群的合并
https://www.nowcoder.com/practice/d0cb24e1494e4f45a4b7d1a17db0daef
大家好,我是开车的阿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!
阿Q的题解 文章被收录于专栏
阿Q秋招刷过的题