题目内容
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 将k个已排好序的链表归并为一个序列。
题目分析
首先想到的是实现归并两个排好序的序列,这里采用最简单的方法,将两个序列的数从头到尾开始一一比较放进一个新的序列。
然后实现归并K个序列,这里采用分治的思想,把k个序列分为两部分,继续划分,直到剩余两个序列,再把它们归并在一起。这里参考了leetcode上面discuss的一个做法,直接把list的前两个序列归并成一个新的序列放在list末端,然后删除这两个序列,以此类推,直到最后只剩下一个序列就是答案了,个人感觉这种方法实现起来比较简单。
代码实现
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
if(lists.size() == 0){
return nullptr;
}
while(lists.size() > 1){
lists.push_back(merge2list(lists[0],lists[1]));
lists.erase(lists.begin());
lists.erase(lists.begin());
}
return lists[0];
}
ListNode* merge2list(ListNode*l1, ListNode*l2){
if(l1 == nullptr){
return l2;
}
if(l2 == nullptr){
return l1;
}
ListNode* result, *p;
if(l1->val > l2->val){
result = l2;
l2 = l2->next;
}else{
result = l1;
l1 = l1->next;
}
p = result;
while(l1 != nullptr && l2 != nullptr){
if(l1->val > l2->val){
p->next = l2;
l2 = l2->next;
}else{
p->next = l1;
l1 = l1->next;
}
p = p->next;
}
if(l1 != nullptr){
p->next = l1;
}
if(l2 != nullptr){
p->next = l2;
}
return result;
}
};