Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
思路:这道题是归并排序的加强版。设置一个数组Min,记录每个链表的待归并的最小值,再设置一个变量minum为所有链表待归并的值的最小值。假设待归并第i个链表时,只需将链表的值与minum对比,若小于,继续向后归并。每归并n个链表后,再找出最小的minum。时间复杂度为O(MN),其中M为链表数,N为最长的链表长度。空间复杂度为O(M)。
class Solution {
public:
ListNode *mergeKLists(vector<ListNode *> &lists) {
int len = lists.size();
if(len == 0)
{
return NULL;
}
int i,j;
vector<int> Min;
Min.resize(len);
int empty = 0;
int minum = INT_MAX;
ListNode* head = new ListNode(0);
ListNode* p = head;
for(i=0; i<len; ++i)
{
if(lists[i] == NULL)
{
Min[i] = INT_MAX;
}
else
{
Min[i] = lists[i]->val;
}
if(minum > Min[i])
{
minum = Min[i];
}
}
while(empty < len) //链表全为空
{
empty = 0;
for(i=0; i<len; ++i)
{
while(lists[i] != NULL && lists[i]->val <= minum)
{
ListNode* pNode = new ListNode(lists[i]->val);
p->next = pNode;
p = p->next;
lists[i] = lists[i]->next;
}
if (lists[i] != NULL)
{
Min[i] = lists[i]->val;
}
else
{
empty++;
Min[i] = INT_MAX;
}
}
minum = INT_MAX;
for(i=0; i<len; ++i)
{
if(minum > Min[i])
{
minum = Min[i];
}
}
}
return head->next;
}
};