题目内容
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;
}
};