本题目需要一个helper class来确定他们的位置和值,跟merge k sorted list思路基本一致。也是用最小堆来实现
注意用来判断是不是这一行最后一个element的写法
class Points{
int x;
int y;
int value;
public Points(int x,int y,int value){
this.x=x;
this.y=y;
this.value=value;
}
}
public class Solution_486 {
/**
* @param arrays k sorted integer arrays
* @return a sorted array
*/
public List<Integer> mergekSortedArrays(int[][] arrays) {
List<Integer> result=new ArrayList<Integer>();
Queue<Points> queue=new PriorityQueue<Points>(arrays.length,new Comparator<Points>(){
public int compare(Points a,Points b){
return a.value-b.value;
}
});
//put the first element of each line in queue
for(int i=0;i<arrays.length;i++){
if(arrays[i].length>0){
Points current=new Points(i,0,arrays[i][0]);
queue.offer(current);
}
}
while(!queue.isEmpty()){
Points min=queue.poll();
result.add(min.value);
//用来判断是不是这一行的终点
if(min.y+1<arrays[min.x].length){
Points next=new Points(min.x,min.y+1,arrays[min.x][min.y+1]);
queue.offer(next);
}
}
return result;
}
}