题目描述
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
- 输入:
[
1->4->5,
1->3->4,
2->6
] - 输出:
1->1->2->3->4->4->5->6
思路
考虑Leetcode(21)合并两个有序链表那道题,使用k个指针分别指向k个链表的思路当然是可以的,但是k个元素的比较过程还是要优化。
不妨考虑归并,把k个链表两两归并。
代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
if(lists.size() == 0)return NULL;
return merge(lists,0,lists.size() - 1);
}
ListNode* merge(vector<ListNode*>& list,int left, int right){
if(left == right) return list[left];
int mid = (left + right ) / 2;
ListNode* l1 = merge(list,left,mid);
ListNode* l2 = merge(list,mid + 1,right);
return mergeTwoLists(l1,l2);
}
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode* p = l1;
ListNode* q = l2;
ListNode *r = new ListNode(0);
ListNode *ret = r;
while(p != NULL & q != NULL){
if(p->val < q->val) {
r->next = p;
p = p->next;
}
else{
r->next = q;
q = q->next;
}
r = r->next;
}
if(p != NULL) r->next = p;
if(q != NULL) r-> next = q;
return ret->next;
}
};