1. 程式人生 > >【LeetCode】23. Merge k Sorted Lists(C++)

【LeetCode】23. Merge k Sorted Lists(C++)

地址:https://leetcode.com/problems/merge-k-sorted-lists/

題目:

Merge k k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.

Example:
在這裡插入圖片描述

理解:

合併k個有序連結串列。想到了外部排序裡面的敗者數,其本質也是一個堆。因此,把k個連結串列的頭結點加到一個小根堆裡,然後把堆頂彈出,並把堆頂的下一個結點加入。

實現:

class Solution {
public:
	ListNode* mergeKLists(vector<ListNode*>& lists) {
		auto comp = [](const ListNode* lhs, const ListNode* rhs) {return lhs->val > rhs->val; };
		priority_queue<ListNode*, vector<ListNode*>, decltype(comp)> q(comp);
		for (auto p : lists)
if (p) q.push(p); if (q.empty()) return nullptr; ListNode* head = q.top(); q.pop(); if (head->next) q.push(head->next); ListNode* p = head; while (!q.empty()) { p->next = q.top(); q.pop(); p = p->next; if (p->next) q.push(p->next); } return head;
} };