题目:合并 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

首先明确思路:对于第一个插入的节点,一定是某一个链表的头节点,而第二个节点,不是当前节点的下一个节点,就是其他链表的头节点…此时需要有一个数据结构,能够找到并去除最小节点,同时还要能插入新节点——这里使用的是“最小堆”

首先定义初始状态——将三个头节点存入堆中,然后找出最小节点作为头节点;接着判断被删去的节点是否存在下一个节点,如果有,就将其存入堆中,之后进行进行相同的判断,直到堆为空

mergeKLists()

 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}

来源:语雀原笔记