您的位置:首页 > 其它

23. Merge k Sorted Lists

2016-07-13 11:51 351 查看
1.问题描述

Merge k sorted
linked lists and return it as one sorted list. Analyze and describe its complexity.

2.解题思路

类似于2路归并法,将K路归并划为2路归并,直到最后得到一个链表,采用递归的方法

3.代码实现

class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if (l1 == nullptr)
return l2;
else if (l2 == nullptr)
return l1;
ListNode *head; //合并后的头节点
if (l1->val > l2->val)
{
head = l2;
l2 = l2->next;
}
else
{
head = l1;
l1 = l1->next;
}
ListNode *r = head;//r保存合并节点的尾节点
//逐一合并
while (l1&&l2)
{
if (l1->val <= l2->val)
{
r->next = l1;
l1 = l1->next;
}
else
{
r->next = l2;
l2 = l2->next;
}
r = r->next;
}
if (l1)
r->next = l1;
if (l2)
r->next = l2;
return head;
}
ListNode* mergeKLists(vector<ListNode*>& lists) {
if (lists.empty())
return nullptr;
if (lists.size() ==1)
return lists[0];
int len = lists.size() % 2 + lists.size() / 2;
vector<ListNode*> v;
vector<ListNode>::size_type i = 0, j = i + 1;
while (i < lists.size())
{
if (j != lists.size())
v.push_back(mergeTwoLists(lists[i], lists[j]));
else
v.push_back(mergeTwoLists(lists[i], nullptr));
i += 2;
j += 2;

}
return mergeKLists(v);
}
};
4.复杂度:
总共K个链表,合并K个链表需要logK次,每次时间复杂度为O(m+n),复杂度为O(logK*(m+n))

5.实现截图

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息