一、合并 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 = [[]]
输出:[]
思路分析
先思考如果两个升序链表该如何排序成一个链表?
可以用双指针把两个链表归并排序。
多个链表的话可以循环两两合并,最终合并成一个链表。但是这样效率太低。
可以使用优先级队列合并
维护当前每个链表没有被合并的元素的最前面一个放入小堆中,自定义比较排序,每次取出堆顶的链表,把该链表的头节点链接到排序链表中,然后把下一个节点再push进优先级队列中,如果是空节点就跳过。
priority_queue自定义比较函数
1️⃣ 使用仿函数
struct cmp
{
bool operator()(ListNode* h1, ListNode* h2)
{
return h1->val > h2->val;
}
};
priority_queue<ListNode*, vector<ListNode*>, cmp> q;
2️⃣ 使用函数指针
static bool cmp(ListNode* h1, ListNode* h2)
{
return h1->val > h2->val;
}
priority_queue<ListNode*, vector<ListNode*>, decltype(&cmp)> q(&cmp);
这里要注意如果是在类里面定义优先级队列要定义在函数体内。
3️⃣ 使用lambda表达式
auto cmp = [](const ListNode* h1, const ListNode* h2){
return h1->val > h2->val;
};
priority_queue<ListNode*, vector<ListNode*>, decltype(cmp)> q(cmp);
代码如下:
class Solution {
public:
struct cmp
{
bool operator()(ListNode* h1, ListNode* h2)
{
return h1->val > h2->val;
}
};
priority_queue<ListNode*, vector<ListNode*>, cmp> q;
ListNode* mergeKLists(vector<ListNode*>& lists) {
int n = lists.size();
for(int i =