题解 | 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;
}
};
查看14道真题和解析