Merge k Sorted Lists
问题描述:
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
知识补充:
删除vector中的元素
lists.erase(lists.
begin()+i);
//删除第i个位置的元素,注意此时vector动态改变,即此时i+
1位置的元素变为现在的i位置
lists.erase(lists.
begin()+i,lists.
begin()+j);
//删除区间[i,j)的元素
优先级队列
priority_queue<
Type, Container, Functional> priQ;
priQ.push();
priQ.top();
priQ.pop();
priQ.
empty();
priQ.size();
测试代码:
ListNode* mergeKLists(vector<ListNode
*>& lists) {
int i=
0,
pos =
0;
if(lists.empty())
return NULL;
while(i<lists.size())
{
if(!lists[i])
{
lists.erase(lists.begin()+i);
continue;
}
i++;
}
ListNode
*p=lists[
0];
ListNode dummy(INT_MIN);
ListNode
*tail = &dummy;
while(!lists.empty())
{
i =
0;
p = lists[
0];
pos =
0;
while(i<lists.size())
{
if(lists[i]->val<p->val)
{
p = lists[i];
pos = i;
}
i++;
}
tail->
next = p;
tail = tail->
next;
if(p->
next)
{
p = p->
next;
lists[
pos] = p;
}
else
{
lists.erase(lists.begin()+
pos);
}
}
return dummy.
next;
}
性能:
参考答案:
class Solution {
public:
struct priQueueCmp {
bool operator() (
const ListNode* l,
const ListNode* r) {
return l->val > r->val;
}
};
ListNode* mergeKLists(
vector<ListNode*>& lists) {
priority_queue<ListNode*,
vector<ListNode*>, priQueueCmp> priQ;
ListNode* head = NULL;
ListNode* lastNode = NULL;
for(
int i =
0; i < lists.size(); ++i) {
if(lists[i] != NULL)
priQ.push(lists[i]);
}
if(priQ.empty())
return head;
head = priQ.top();
lastNode = head;
priQ.pop();
if(head->next != NULL)
priQ.push(head->next);
while(!priQ.empty())
{
ListNode* minNode = priQ.top();
lastNode->next = minNode;
lastNode = minNode;
priQ.pop();
if(minNode->next != NULL)
priQ.push(minNode->next);
}
return head;
}
};
性能: