题目:合并 K 个升序链表
参考:https://leetcode.cn/problems/merge-k-sorted-lists/solutions/2384305/liang-chong-fang-fa-zui-xiao-dui-fen-zhi-zbzx/?envType=problem-list-v2&envId=91oI3WTD
首先明确思路:对于第一个插入的节点,一定是某一个链表的头节点,而第二个节点,不是当前节点的下一个节点,就是其他链表的头节点…此时需要有一个数据结构,能够找到并去除最小节点,同时还要能插入新节点——这里使用的是“最小堆”
首先定义初始状态——将三个头节点存入堆中,然后找出最小节点作为头节点;接着判断被删去的节点是否存在下一个节点,如果有,就将其存入堆中,之后进行进行相同的判断,直到堆为空
1ListNode* mergeKLists(vector<ListNode*>& lists)
2{
3 auto cmp = [](ListNode* a, ListNode* b)
4 {
5 return a->val > b -> val;
6 };
7 std::priority_queue<ListNode*, std::vector<ListNode*>, decltype(cmp)> less_heap;
8
9 for(auto head : lists)
10 {
11 if(head != nullptr)
12 less_heap.push(head);
13 }
14
15 ListNode dummy(0);
16 ListNode* head = &dummy;
17 while(!less_heap.empty())
18 {
19 auto node = less_heap.top();
20 less_heap.pop();
21 if(node->next != nullptr)
22 {
23 less_heap.push(node->next);
24 }
25 head->next = node;
26 head = head->next;
27 }
28 return dummy.next;
29}
来源:语雀原笔记