文章目录
- 1. 题目信息
- 2. 思路
- 3. 代码
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;}
};