题目链接:点击查看
题目描述:
给定 k 个增序的链表,试将它们合并成一条增序链表。
输入输出:
输入:lists = [[1,4,5],[1,3,4],[2,6]] 输出:[1,1,2,3,4,4,5,6]
输入:lists = [] 输出:[]
题目分析:
把所有的链表存储在一个优先队列中,每次提取所有链表头部节点值最小的那个节点,直到所有链表都被提取完为止。注意因为 cmp
函数默认是对最大堆进行比较并维持递增关系,如果我们想要获取最小的节点值,则我们需要实现一个最小堆,因此比较函数应该维持递减关系,所以 operator()
中返回时用大于号而不是等增关系时的小于号进行比较。
代码:
struct cmp
{
bool operator()(ListNode *l1,ListNode *l2)
{
return l1->val>l2->val;
}
};
ListNode *mergeKLists(vector<ListNode*>lists)
{
if(lists.empty())
return nullptr;
priority_queue<ListNode*,vector<ListNode*>,cmp>q;
for(ListNode *list:lists)
{
if(list)
{
q.push(list);
}
}
ListNode *dummy=new ListNode(0),*cur=dummy;//将最小堆压入dummy形成一个新链表
while(!q.empty())
{
cur->next=q.top();
q.pop();
cur=cur->next;
if(cur->next)
{
q.push(cur->next);
}
}
return dummy->next;
}