题解 | #合并k个已排序的链表#
合并k个已排序的链表
https://www.nowcoder.com/practice/65cfde9e5b9b4cf2b6bafa5f3ef33fa6
桶排序YYDS
给的限制条件中,k和n都比较大,val大小被限制,时间限制比较严格,空间几乎无限,直接用空间换时间的方法,通过桶排序解决问题
第一步统计每个数值的个数,这里使用Map,统计很方便,还有自动排序的功能
ListNode *head, *temp, *cur;
head = nullptr;
map<int,int> m = {};
for (int i = 0;i < lists.size();i++){
for (temp = lists[i];temp != nullptr;temp=temp->next){
if (m.find(temp->val) != m.end()){
m[temp->val] += 1;
}
else{
m.insert(pair<int,int>(temp->val,1));
}
}
}
第二步处理下特殊情况
if (m.size() == 0){
return head;
}
第三步按照顺序新建ListNode输出就完事了,如果想要进一步提高性能,可以把while循环改成for循环便利map,这样就不用erase操作了
这里我新建了一个额外的节点避免在循环中给head赋值,减少判断的次数
head = new ListNode(100);
cur = head;
while(m.size() != 0){
int num = m.begin()->second,val = m.begin()->first;
for (int i = 0;i < num;i++){
temp = new ListNode(val);
cur->next = temp;
cur = temp;
}
m.erase(val);
}
head = head->next;
return head;
