题目:
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
分析:
将k个链表分组,两个一组,并将同一组的链表合并;完成后
个链表被合并成了
个,重复这个过程,直到合并为1个链表。
时间复杂度
,
为链表元素和
空间复杂度
代码如下:
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2)
{
if (l1 == NULL) return l2;
if (l2 == NULL) return l1;
ListNode* fir = new ListNode(0);
ListNode* sec = fir;
while (l1 != NULL && l2 != NULL)
{
if (l1->val <= l2->val) {
sec->next = l1;
l1 = l1->next;
}
else {
sec->next = l2;
l2 = l2->next;
}
sec = sec->next;
}
if (l1 == NULL)
{
sec->next = l2;
}
else
{
sec->next = l1;
}
return fir->next;
}
ListNode* mergeKLists(vector<ListNode*>& lists)
{
int len = lists.size();
if (len == 0) return NULL;
int num = 1;
while (num < len)
{
for (int i = 0; i < len - num; i += 2 * num)
{
lists[i] = mergeTwoLists(lists[i], lists[i + num]);
}
num *= 2;
}
return lists[0];
}
};