Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
#解析 要合并k个有序链表l1, l2, l3,...lk,我们只需两两合并。比如先l1 和 l2合并,然后用此合并后的链表和l3进行合并。 在已经实现了Merge Two Sorted Lists的基础上,完成此题不算太难。 值得思考的地方在于怎么觉得合并的顺序,即先合并哪两个链表,合并后的链表再怎么处理。
##解法一 先合并第一个和最后一个链表,并将合并后的链表保存在第一个链表中。左右链表同时向中间靠拢。 这样一来,一次循环之后,前半部分的链表保存了两两合并后的新链表。 我们再在前半部分的链表中,重复上述动作。直到只剩一个链表,即为所求结果。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* merge2Lists(ListNode* l1, ListNode* l2){
if(NULL == l1) return l2;
else if(NULL == l2) return l1;
if(l1->val < l2->val){
l1->next = merge2Lists(l1->next, l2);
return l1;
}
else {
l2 -> next = merge2Lists(l2->next, l1);
return l2;
}
}
ListNode* mergeKLists(vector<ListNode*>& lists) {
if(lists.empty()) return NULL;
int len = lists.size();
while(len > 1){
for(int i = 0; i < len / 2; ++i){
lists[i] = merge2Lists(lists[i], lists[len - 1 -i]);
}
len = (len + 1) / 2;
}
return lists.front();
}
};
##解法二
vector<ListNode*>& lists
中保存了所有链表,我们先合并前两个链表,并将结果插入到lists后面,同时删除前两个链表,以此循环,直到lists中只保存了一个链表为止。
ListNode *mergeKLists(vector<ListNode *> &lists) {
if(lists.empty()){
return nullptr;
}
while(lists.size() > 1){
lists.push_back(merge2Lists(lists[0], lists[1]));
lists.erase(lists.begin());
lists.erase(lists.begin());
}
return lists.front();
}