Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
思路:构建一个大小为K的小顶堆。每次从堆顶取走一个元素后,都将这个元素所属的链表中下一个元素加入堆中。若没有下一个元素则不添加。该过程一直持续到堆空位置。时间复杂度O(nlogk)。
用优先队列实现:
用优先队列实现的声明如下:
priority_queue<元素类型, 该类型的容器(如vector<元素类型>), 比较类(自己定义)> 名称;
比如这个题中,我的声明语句为priority_queue<ListNode *, vector<ListNode *>, comp> q;
这里,ListNode指针类型的星号要与前面的类型名称用空格隔开,否则会报错。
比较类定义见具体代码。
1 struct comp 2 { 3 bool operator()(ListNode* n1, ListNode* n2) 4 { 5 return n1->val > n2->val; 6 } 7 }; 8 class Solution { 9 public: 10 ListNode* mergeKLists(vector<ListNode*>& lists) { 11 priority_queue<ListNode *, vector<ListNode *>, comp> q; 12 for (auto i : lists) 13 if (i) q.push(i); 14 if (q.empty()) return NULL; 15 ListNode* res = q.top(); 16 ListNode* pre = res; 17 q.pop(); 18 if (pre->next) q.push(pre->next); 19 while (!q.empty()) 20 { 21 pre->next = q.top(); 22 q.pop(); 23 pre = pre->next; 24 if (pre->next) 25 q.push(pre->next); 26 } 27 return res; 28 } 29 };
时间: 2024-10-27 10:43:41