这道题目就是注明的K sort问题。和彩虹排序一样,出自名门。常考题目。
既然是k sort merge, 就能用典型的merge 算法。 于是就有了一下几个办法
1. 两两merge成一个链表,然后再重复这个过程。直到就一个链表。
while(lists.size() >1){
vector<ListNode*> newLists;
int size = lists.size();
for(int i = 0; i+1< size;i=i+2){
ListNode* tmp = mergeTwoList(lists[i], lists[i+1]);
newLists.push_back(tmp);
}
if(size %2 == 1)
newLists.push_back(lists[size - 1]);
lists = newLists;
}
但是这样做会超时。。。。。。 因为时间复杂度比较高。
首先logN的for循环。 每一个勋魂都是N。 一共是NlogN
2)用merge sort的思路。
mergeHelper(lists, 0, lists.size()-1);
ListNode* mergeHelper(vector<ListNode*>& lists, int start, int end) {
if(start == end)
return lists[start];
int mid = start + (end -start)/2;
ListNode* left = mergeHelper(lists, start, mid);
ListNode* right = mergeHelper(lists, mid + 1, end);
return mergeTwoList(left, right);
}
结果 也是超时了。。。。
3)优先队列。。。。
每次把最小的放到top里。然后靠优先队列把每个ListNode 排好序。
N次push进PQ,然后PQ排序时间暂时不知道。估计也是LogK时间长度。
我觉得最难的是priority_queue 的cmp 写法。竟然是个struct。。。。
百思不得其解。。。。。。
struct cmp {
bool operator()(ListNode *a, ListNode *b) { return a->val >= b->val;}
};
ListNode* mergeKLists(vector<ListNode*>& lists) {
priority_queue<ListNode*, vector<ListNode*>, cmp> pq;
for(int i = 0;i < lists.size();i++){
if(lists[i] != NULL)
pq.push(lists[i]);
}
ListNode *dummy = new ListNode(0);
ListNode *tail = dummy;
while(!pq.empty()){
ListNode *tmp = pq.top();
tail->next=tmp;
tail = tmp;
pq.pop();
if(tmp->next != NULL)
pq.push(tmp->next);
}
tail->next = NULL;
return dummy->next;
}
};