1、题目描述
给了k个有序链表。返回合并成的一个链表。
2、思路
两个两个合并,合并到只剩下一个返回。
思路2:优先队列(即堆排序)。
3、代码
ListNode* mergeKLists(vector<ListNode*>& lists) {
if(lists.size()==0) return NULL;
while(lists.size()>1){
lists.push_back(merge(lists[0],lists[1]));
lists.erase(lists.begin());
lists.erase(lists.begin());
}
return lists[0];
}
ListNode* merge(ListNode* a,ListNode* b){
ListNode* ans = new ListNode(-1);
ListNode* p =ans;
while(a&&b){
if(a->val<b->val){
ans->next = a;
a=a->next;
ans=ans->next;
}
else{
ans->next = b;
b=b->next;
ans=ans->next;
}
}
if(a)
ans->next = a;
if(b)
ans->next = b;
return p->next;
}
struct cmp{
bool operator()(ListNode* a,ListNode* b){
return a->val > b->val;
}
};
class Solution {
public:
ListNode *mergeKLists(vector<ListNode *> &lists) {
if(lists.size() == 0)
return NULL;
priority_queue<ListNode*, vector<ListNode*>, cmp> queue;
for(int i = 0; i < lists.size(); i++) {
if(lists[i] != NULL)
queue.push(lists[i]);
}
ListNode * head = new ListNode(-1);
ListNode * ans = head;
while(queue.size() > 0) {
ListNode * t = queue.top();
queue.pop();
head->next = t;
head = head->next;
if(t->next)
queue.push(t->next);
}
return ans->next;
}
};