题目
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
难易度:Hard
分析
合并k个有序链表。如果逐一合并的话会超时,所以利用分治来解决这个问题,将问题分解为2个合并k/2个有序链表的子问题,一直划分,直到子问题中只有一个或零个链表。此处我使用非递归的方法解决该问题,如,合并1,2,3,4,5链表时,先合并得到13,24,5,再合并得到135,24,最终合并所有链表。算法时间复杂度为O(nlogk),空间复杂度为O(1)。
代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode* head = new ListNode(0);
ListNode* p = head;
head->next = l1;
while(l1 != NULL && l2 != NULL)
{
if(l1->val > l2->val)
{
ListNode *next = l2->next;
l2->next = p->next;
p->next = l2;
l2 = next;
}
else
{
l1 = l1->next;
}
p = p->next;
}
if(l2 != NULL)
{
p->next = l2;
}
return head->next;
}
ListNode* mergeKLists(vector<ListNode*>& lists) {
int k = lists.size();
if(k == 0)
return NULL;
while(k > 1)
{
int n = (k+1)/2;
for(int i = 0;i < k/2; i++)
{
lists[i] = mergeTwoLists(lists[i],lists[i+n]);
}
k = n;
}
return lists[0];
}
};
注:
1.vector相当于动态数组
2.vector< int > a相当于int a[]; vector< int* > a 一维数组向量,相当于二维数组