题目描述
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
思路
- 首先遍历所有链表,将对应的数值保存到数组中,之后遍历数组创建新的链表即可
- 分治:每个链表先与下一个链表融合,这样讲链表总数从k将至k/2,重复直至链表总数为1,返回头部指针即可
代码
方法一:
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
if(lists.size()==0)
return NULL;
vector<int> res;
for(int i = 0; i < lists.size();i++)
{
ListNode* head = lists[i];
while(head!=NULL)
{
res.push_back(head->val);
head = head->next;
}
}
if(res.size()==0)
return NULL;
sort(res.begin(),res.end());
ListNode* res_head = new ListNode(res[0]);
ListNode* cur = res_head;
for(int i = 1;i<res.size();i++)
{
ListNode* next = new ListNode(res[i]);
cur->next = next;
cur = cur->next;
}
return res_head;
}
};
方法二:
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
if(lists.size()==0)
return NULL;
while(lists.size()>1)
{
int size = lists.size();
int i = 0;
for(; i < size ;i=i+2)
{
if(i+1 <size)
{
if(lists[i] && lists[i+1]) /*判断头部是否均为空,均不为空则融合,一个为空则将不为空的压入,都为空则跳过即可*/
{
if(lists[i]->val >lists[i+1]->val)
lists.push_back(mergeTwoLists(lists[i+1],lists[i]));
else
lists.push_back(mergeTwoLists(lists[i],lists[i+1]));
}
else if(lists[i] == NULL && lists[i+1])
lists.push_back(lists[i+1]);
else if(lists[i+1] == NULL && lists[i])
lists.push_back(lists[i]);
}
}
if(size%2==0)
lists.erase(lists.begin(),lists.begin()+size);
else
lists.erase(lists.begin(),lists.begin()+size-1);
}
return lists[0];
}
ListNode* mergeTwoLists(ListNode* l1,ListNode* l2)
{
ListNode* res_head = l1;
ListNode* cur = res_head;
l1 = l1->next;
while(l1 != NULL || l2 !=NULL)
{
if(l1 == NULL)
{
cur->next = l2;
break;
}
else if(l2 == NULL)
{
cur->next = l1;
break;
}
else
{
if(l1->val > l2->val)
{
cur->next = l2;
l2 = l2->next;
}
else
{
cur->next = l1;
l1 = l1->next;
}
cur = cur->next;
}
}
return res_head;
}
};