LeetCode23. 合并K个升序链表

题目

分析

本题思想不难,就是仿照合并两个升序链表的思路,假设 k 个 链表,最长的链表长度为 n,那么只用将 k 个链表表头元素相比找到最小的

插到新的链表表尾即可。这样的话时间复杂度 为 O(n * k)。我们可以进一步优化,k个链表表头元素比较取最小, 我们可以采用堆,这样

取最小的时间为O(1),然后再把链表下一个元素插到堆里面的时间复杂度为O(log K),总体时间复杂度就被优化为O(n * logk)

 

有关priority_queue来实现小根堆的链接 :https://www.cnblogs.com/huashanqingzhu/p/11040390.html

代码

 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     ListNode *next;
 6  *     ListNode() : val(0), next(nullptr) {}
 7  *     ListNode(int x) : val(x), next(nullptr) {}
 8  *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 9  * };
10  */
11 class Solution {
12 public:
13 
14     struct Cmp{
15         bool operator() (ListNode *a,ListNode *b){
16             return a->val > b->val;
17         }
18     };
19     ListNode* mergeKLists(vector<ListNode*>& lists) {
20         priority_queue<ListNode*,vector<ListNode*>,Cmp>heap;
21         auto dummy = new ListNode(-1),cur = dummy;
22 
23         for(auto l : lists){
24             if(l) heap.push(l);
25         }
26 
27         while(heap.size()){
28             auto t = heap.top();
29             heap.pop();
30 
31             cur->next = t;
32             cur = cur->next;
33 
34             if(t->next) heap.push(t->next);
35         }
36 
37         return dummy->next;
38 
39         
40     }
41 };

 

posted @ 2022-03-28 23:00  Uitachi  阅读(18)  评论(0编辑  收藏  举报