描述
合并 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;}
};