Leetcode 023 合并K个升序链表 堆 链表

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

给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。

示例 1:
输入:lists = [[1,4,5],[1,3,4],[2,6]]
输出:[1,1,2,3,4,4,5,6]
解释:链表数组如下:
[
  1->4->5,
  1->3->4,
  2->6
]
将它们合并到一个有序链表中得到。
1->1->2->3->4->4->5->6

示例 2:
输入:lists = []
输出:[]

示例 3:
输入:lists = [[]]
输出:[]
 

提示:
k == lists.length
0 <= k <= 10^4
0 <= lists[i].length <= 500
-10^4 <= lists[i][j] <= 10^4
lists[i] 按 升序 排列
lists[i].length 的总和不超过 10^4

解答
最原始的想法就是
1 每次遍历所有链表 找出链表头数据最小的那个链表a
2 取出链表a的第一个最小树存储,然后从链表a删除该数据。再次进入遍历所有链表 找出最小数据链表的过程1
循环直到所有链表为空 . 假设链表为k项 时间复杂度为O(km)

优化办法
每次遍历都是为了寻找链表头数值最小的链表
那么我们使用最小堆来存储链表头,每次链表头数值最小的链表在堆顶端,可以节省每次遍历的时间。 复杂度为O(m*logK)

class Solution {
public:
	struct cmp {
		bool operator ()(ListNode *a, ListNode* b) {
			return a->val > b->val;//最小值优先 
		}
	};
	priority_queue<ListNode*, vector<ListNode*>, cmp > Q;
	
	ListNode* mergeKLists(vector<ListNode*>& lists) {
		for (auto& e : lists) {
            if(e!=NULL)
			    Q.push(e);
		}
		ListNode* ans = new ListNode(-999999);
		ListNode* p = ans;
		while (!Q.empty()) {
			ListNode* curr = Q.top();
			Q.pop();
			p->next = new ListNode(curr->val);
			curr = curr->next;
			if (curr != NULL) {
				Q.push(curr);
			}
			p = p->next;
		}

		return ans->next;
	}
};

我的视频题解空间

posted on 2021-10-27 21:33  itdef  阅读(75)  评论(0编辑  收藏  举报

导航