题解 | #合并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;











全部评论

相关推荐

点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务