题解 | map缓存池链表合并

合并k个已排序的链表

https://www.nowcoder.com/practice/65cfde9e5b9b4cf2b6bafa5f3ef33fa6

1.要按序合并排列k个已排序的链表,首先想到的是取出各个链表的head节点作为一个缓存池pool,并且pool最好也要排序

2.之后从pool中取出最小值,该节点的next节点放入到pool中,pool中各个节点还是要排序,去一个放一个维持pool

3.若某此从pool中取得最小值节点是该链表得tail(next指向nullptr),说明此链表已经全部取完,那此链表没有节点往pool中放

4.步骤2,3一直迭代,直至pool为空,所有链表已经取完

class Solution {
public:
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        //初始化multimap,默认是按照键值升序存储
        multimap<int,ListNode*> pool;
        for(int i=0;i<lists.size();i++)
        {
            if(lists[i]==nullptr)
                continue;
            pool.insert(std::pair<int,ListNode*>(lists[i]->val,lists[i]));
        }
        ListNode* res=new ListNode(0);
        ListNode* cur=res;
        while(!pool.empty())
        {
            cur->next=pool.begin()->second;//每次cur会指向pool中最小值节点地址
            cur=cur->next;//cur更新至最小值节点
            //最小值节点next非空节点存入pool中,若为nullptr说明该条链表已取到tail,不再放入pool中
            if(pool.begin()->second->next!=nullptr)
                pool.insert(std::pair<int,ListNode*>(pool.begin()->second->next->val, pool.begin()->second->next));
            pool.erase(pool.begin());//pool中删除当前最小值节点
        }
        return res->next;
    }
};

全部评论

相关推荐

牛客5655:其他公司的面试(事)吗
点赞 评论 收藏
分享
牛客969571862号:昨天捞我今天面这个,岗位一模一样,感觉就是面着玩
点赞 评论 收藏
分享
评论
1
1
分享
牛客网
牛客企业服务