0
点赞
收藏
分享

微信扫一扫

【NC51 合并k个已排序的链表】K路归并

 

描述

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


举报

相关推荐

0 条评论