Problem
You are given an array of k linked-lists lists, each linked-list is sorted in ascending order.
Merge all the linked-lists into one sorted linked-list and return it.
Example 1:
1 | Input: lists = [[1,4,5],[1,3,4],[2,6]] |
Example 2:
1 | Input: lists = [] |
Example 3:
1 | Input: lists = [[]] |
Constraints:
k == lists.length0 <= k <= 10^40 <= lists[i].length <= 500-10^4 <= lists[i][j] <= 10^4lists[i]is sorted in ascending order.- The sum of
lists[i].lengthwon’t exceed10^4.
Analysis
这道题目要求合并k个有序链表,其实跟合并两个有序链表是一样的。合并两个的话,只需要对比A和B的元素,然而合并k个的话,就需要对比k个队列的头。这里我们就要善用数据结构了。我们的需求是在k个元素中维护一个最小值,每次都取出最小的那个,那符合这个用途的无疑就是最小堆(优先队列)了。
确定好使用优先队列,这道题目就变得很容易。把每个队列的头放入到优先队列中,每次从中取出头部(值最小的),然后把它的后一个节点也加入到队里中,一直遍历直到队列为空。
Solution
因为拿出一个元素后,需要把它后面一个元素放入到队列中,所以队列存的不是数值,而是节点的指针。
Code
1 | /** |
Summary
这道题目是优先队列的一个经典应用,看似很复杂的题目,只要使用合适的数据结构,就能够很轻易地解决。这道题这道题目的分享到这里,谢谢您的支持!