手机网站生成工具,网站后台登录不进去,福州如何做百度的网站,手机上如何创建微信公众号目录
23. 合并 K 个升序链表
题目描述#xff1a;
实现代码与解析#xff1a;
优先级队列#xff1a;
原理思路#xff1a; 23. 合并 K 个升序链表
题目描述#xff1a; 给你一个链表数组#xff0c;每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表…目录
23. 合并 K 个升序链表
题目描述
实现代码与解析
优先级队列
原理思路 23. 合并 K 个升序链表
题目描述 给你一个链表数组每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中返回合并后的链表。
示例 1
输入lists [[1,4,5],[1,3,4],[2,6]]
输出[1,1,2,3,4,4,5,6]
解释链表数组如下
[1-4-5,1-3-4,2-6
]
将它们合并到一个有序链表中得到。
1-1-2-3-4-4-5-6示例 2
输入lists []
输出[]示例 3
输入lists [[]]
输出[]提示
k lists.length0 k 10^40 lists[i].length 500-10^4 lists[i][j] 10^4lists[i] 按 升序 排列lists[i].length 的总和不超过 10^4
实现代码与解析
优先级队列
/*** 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 Node{int val;ListNode* ptr;bool operator (const Node node) const{return val node.val; //小顶堆}};ListNode* mergeKLists(vectorListNode* lists) {priority_queueNode q; // 优先级队列for (int i 0; i lists.size(); i){if (lists[i]) q.push({lists[i]-val, lists[i]}); // 入队}ListNode* head new ListNode(); // 头节点ListNode* cur head;while(q.size()){auto t q.top(); q.pop(); // 出队cur-next t.ptr;cur cur-next;auto nt t.ptr-next; if (nt) q.push({nt-val, nt}); // 已经出队的节点将其下一个节点入队}return head-next;}
};
原理思路 优先级队列小顶堆定义一个结构体里面存有节点值用于堆的比较指针用于记录链表中节点的位置每次取出节点记得把其后面相连的节点入队比较直到为空为止。很简单不再详细解释了。