一种结合链表和优先队列的优雅解法,巧妙之处在于使用优先队列出队元素,可以直接得到下一个入队元素,算法复杂度是O(nlgn)。联想到如果不是优先队列结构,那么我们可以使用同样的解法,只是我们需要在队列中记录每个元素属于哪一行,而使用链表结构就避免了这种麻烦。
题目
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
分析
如摘要中所说,最小元素一定是每一个链表最前面的元素之一,在其中选取最小的。那么,自然就是使用优先队列了。
另外,一个小技巧,代码中使用了哑节点,方便书写循环。
代码
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
priority_queue<ListNode *, vector<ListNode*>, cmp> q;
for (auto l : lists){
if (l){
q.push(l);
}
}
if (q.empty()){
return NULL;
}
ListNode dummy(0);
ListNode* node = &dummy;
while (!q.empty()){
node->next = q.top();
q.pop();
node = node->next;
if (node->next){
q.push(node->next);
}
}
return dummy.next;
}
private:
struct cmp{
bool operator()(const ListNode* l, const ListNode* r){
return l->val > r->val;
}
};
};