leetcode编程记录6 #23 Merge k Sorted Lists
标签(空格分隔): leetcode
这次是一道关于合并k个有序链表的题目,题目如下:
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
题目理解与分析:
题目要求我们合并k个有序的链表。而我们并不知道这个k个链表是否为空,所以我们首先要删去这k个链表中为空的链表,最后再来处理剩余的几个链表。而对于剩下的几个链表则可以从每个链表的第一个元素开始寻找最小的元素,来依次构造一个最终结果的链表。
这样的话,假设有k个链表,每个链表平均长度为m的话,复杂度则是O((k*m)^2)的。
代码如下:
/**
* 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) {
for (auto i = 0; i < lists.size(); i++)
{
if(lists[i] == NULL)
{
lists.erase(lists.begin() + i);
i = 0;
}
}
if (lists.size() == 0)
{
return NULL;
}
if (lists.size() == 1)
{
return lists[0];
}
ListNode* result = new ListNode(lists[0]->val);
ListNode* current = result;
for (; lists.size() > 1; )
{
int index = 0;
for (int i = 1; i < lists.size(); i++)
{
if (lists[i]->val < lists[index]->val)
{
index = i;
}
}
current->next = new ListNode(lists[index]->val);
current = current->next;
lists[index] = lists[index]->next;
for (auto i = lists.begin(); i != lists.end(); i++)
{
if(*i == NULL)
{
lists.erase(i);
break;
}
}
}
current->next = lists[0];
result = result->next;
return result;
}
};