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 };