/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ #include <functional> #include <list> #include <queue> class Solution { public: ListNode *mergeKLists(vector<ListNode *> &lists) { auto cmp = [](ListNode *a, ListNode *b) { return a->val > b->val; }; priority_queue<ListNode *, vector<ListNode *>, decltype(cmp)> pq(cmp); for (auto &i: lists) { if (i) { pq.push(i); } } ListNode *res = nullptr, **ptr = &res; while (!pq.empty()) { auto now = pq.top(); pq.pop(); if (now->next) { pq.push(now->next); } *ptr = now; ptr = &((*ptr)->next); } return res; } };
思路:优先队列。
* 先将所有链表的第一个元素放进去。
* 通过最小堆的性质,获得堆顶节点,也就是最小的节点。
* 该节点的next节点如果不为空,则将其放进堆中。