题解 | #合并k个已排序的链表#
合并k个已排序的链表
https://www.nowcoder.com/practice/65cfde9e5b9b4cf2b6bafa5f3ef33fa6
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) : val(x), next(nullptr) {}
* };
*/
#include <vector>
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param lists ListNode类vector
* @return ListNode类
*/
ListNode* mergeKLists(vector<ListNode*>& lists) {
// write code here
vector<int> nums;
for(int i=0;i<lists.size();i++){
ListNode* p=lists[i];
while(p!=nullptr){
nums.push_back(p->val);
p=p->next;
}
}
return heapsort(nums, nums.size());
}
private:
ListNode* heapsort(vector<int> nums,int heapsize){
ListNode* res=new ListNode(0);
ListNode *p=res;
for(int i=(heapsize-1)/2;i>=0;i--){
heapify_down(nums, nums.size(),i);
}
for(int i=heapsize-1;i>=0;i--){
ListNode* tmp=new ListNode(nums[0]);
p->next=tmp;
p=tmp;
swap(nums[0],nums[i]);
heapsize--;
heapify_down(nums, heapsize, 0);
}
return res->next;
}
void heapify_down(vector<int> &nums,int heapsize,int i){//小根堆
int largest=i;
int left=2*i+1;
int right=2*i+2;
if(left<heapsize&&nums[largest]>nums[left]){
largest=left;
}
if(right<heapsize&&nums[largest]>nums[right]){
largest=right;
}
if(largest!=i){
swap(nums[largest],nums[i]);
heapify_down(nums,heapsize, largest);
}
}
};

查看2道真题和解析