这一题我的解也不好意思说出口,把所有值装入变长数组,排序,再转换成链表
复杂度应该在O(nlogn)
开销处于中流水平
评论中的 分治法(二分递归) 最小堆(C++优先队列实现) 着实没想到
struct ListNode
{
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode *mergeKLists(vector<ListNode *> &lists)
{
ListNode *head=NULL;
vector<int> nums;
for (auto l : lists) //把所有链表的值都放入nums 统一排序再转换成链表;
{
while (l != NULL)
{
nums.push_back(l->val);
l = l->next;
}
}
sort(nums.begin(), nums.end());
if(nums.size()==0) return head;
ListNode *p = new ListNode(nums[0]);
head = p;
int len = nums.size();
for (int i = 1; i < len; i++)
{
ListNode *temp=new ListNode(nums[i]);
p->next=temp;
p=temp;
}
p->next=NULL;
return head;
}
刚刚用了一下优先队列,感觉跟我的题解效率差不多
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
ListNode *head=NULL;
priority_queue <int,vector<int>,greater<int>> q;
for(auto l:lists)
{
while(l!=NULL)
{
q.push(l->val);
l=l->next;
}
}
if(q.size()==0) return head;
ListNode *p=new ListNode(q.top());
q.pop();
head=p;
while(!q.empty())
{
ListNode *temp=new ListNode(q.top());
q.pop();
p->next=temp;
p=temp;
}
p->next=NULL;
return head;
}
};