今天是刷leetcode打卡的第3天。每日一次,例行打气。
今天看到leetcode推荐了一道题名字叫“合并K个排序链表”
题目描述:
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例输入:
[[1,4,5],[1,3,4],[2,6]]
示例输出:
[1,1,2,3,4,4,5,6]
稍微一看,哦吼,这不就是链表合并嘛,我们首先可以想到的是一个while() 循环,安排它一手,可是定睛一看,不对,这是K个链表,那总不能while() 套while() 啊 ,那岂不是太复杂。
后来我想遍了我脑海中所有的数据结构,突然发现了C++里面有一个好东西叫做 ----> “优先队列” 这简直就是雪中送炭啊。
思路: 使用优先队列,先把所有的元素放进优先队列中,大的放在前面,然后再用链表的头插法就变成了一个降序的有序链表。
话不多说,安排
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
priority_queue<int> a;
for(int i = 0; i < lists.size();i++){
while(lists[i] != NULL){
a.push(lists[i]->val);
lists[i] = lists[i]->next;
}
}
ListNode* newHead = NULL;
while(!a.empty()){
ListNode* pTemp = new ListNode();
pTemp->val = a.top();
pTemp->next = newHead;
newHead = pTemp;
a.pop();
}
return newHead;
}
};
有人说,你若盛开,蝴蝶自来
可是他不知道的是,当你盛开的时候,来到你面前的那个蝴蝶却不是你日思夜想的那个蝴蝶。