描述
合并 k 个升序的链表并将结果作为一个升序的链表返回其头节点。
数据范围:节点总数 0 \le n \le 50000≤n≤5000,每个节点的val满足 |val| <= 1000∣val∣<=1000
要求:时间复杂度 O(nlogn)O(nlogn)
示例1
输入:
[{1,2,3},{4,5,6,7}]
返回值:
{1,2,3,4,5,6,7}
示例2
输入:
[{1,2},{1,4,5},{6}]
返回值:
{1,1,2,4,5,6}
解题报告:
区分于归并排序。归并排序是说,给定一个无序数组给排序成有序数组。
这个是说,给定K个有序链表,要求合并成一个有序链表
当然,本质的merge(h1, h2)函数没变,都是把两个有序序列给合并成一个有序序列。
这题还有一种做法,不过空间复杂度较高一些,时间复杂度是一样的,就是用优先队列来存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) {
return mergeList(lists, 0, lists.size()-1);
}
ListNode* mergeList(vector<ListNode *> lists, int l, int r) {
if(l == r) {return lists[l];}
if(l > r) {return nullptr;}
int mid = (l+r)/2;
return mer(mergeList(lists, l, mid), mergeList(lists, mid+1, r));
}
ListNode* mer(ListNode* h1, ListNode* h2) {
ListNode* head = new ListNode(-1);
ListNode* p = head;
while(h1 && h2) {
if(h1->val < h2->val) {
p->next = h1;h1 = h1->next;p = p->next;
} else {
p->next = h2;h2 = h2->next;p = p->next;
}
}
if(h1) p->next = h1;
else p->next = h2;
return head->next;
}
};