1. 题目信息
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-k-sorted-lists
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 思路
- 建立优先队列(小顶堆)
- 将每个链表的队首指针push进入优先队列,O(k)
- 取出堆顶,读取堆顶的值,插入新的链表,O(1)
- 将堆顶的next指针(如果存在)push进入优先队列,O(logk)
- 弹出堆顶,O(logk)
- 循环以上 3-6 ,复杂度*n(总的结点个数)
总的时间复杂度O(n • logk)
3. 代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution
{
public:
struct cmp
{
bool operator()(ListNode *a, ListNode *b)
{
return a->val > b->val;
}
};
ListNode* mergeKLists(vector<ListNode*>& lists)
{
priority_queue<ListNode*, vector<ListNode*>, cmp> queue;
ListNode *head = new ListNode(0);
ListNode *temp = head, *topNext;
for(int i = 0; i < lists.size(); ++i)
{
if(lists[i])
queue.push(lists[i]);
}
while(!queue.empty())
{
temp->next = queue.top();
temp = temp->next;
topNext = queue.top()->next;
queue.pop();
if(topNext)
queue.push(topNext);
}
return head->next;
}
};