BM5 合并k个已排序的链表
描述
合并 k 个升序的链表并将结果作为一个升序的链表返回其头节点。
数据范围:节点总数 0≤n≤5000,每个节点的val满足 ∣val∣<=1000
要求:时间复杂度 O(nlogn)
示例1
输入: [{1,2,3},{4,5,6,7}]
返回值:{1,2,3,4,5,6,7}
示例2输入:[{1,2},{1,4,5},{6}]
返回值:{1,1,2,4,5,6}
代码
java
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* public ListNode(int val) {
* this.val = val;
* }
* }
*/
(一)分治方法
1、从链表数组的首和尾开始,每次划分从中间开始划分,划分成两半,得到左边n/2个链表和右边n/2个链表。
2、继续不断递归划分,直到每部分链表数为1.
3、将划分好的相邻两部分链表,按照两个有序链表合并的方式合并,合并好的两部分继续往上合并,直到最终合并成一个链表。
【用到了递归的思想】
java
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param lists ListNode类ArrayList
* @return ListNode类
*/
public ListNode mergeKLists (ArrayList<ListNode> lists) {
return mergeAll(lists,0,lists.size()-1);
}
public ListNode mergeAll(ArrayList<ListNode> lists,int left,int right){
if(left<right){
int mid = (left+right)/2;
return merge(mergeAll(lists,left,mid),mergeAll(lists,mid+1,right));
}else if(left==right){
return lists.get(left);
}else{
return null;
}
}
public ListNode merge(ListNode node1,ListNode node2){
if(node1==null) return node2;
if(node2==null) return node1;
ListNode head;
if(node1.val<=node2.val){
head = node1;
node1=node1.next;
}else{
head = node2;
node2=node2.next;
}
ListNode result = head;
while(node1!=null && node2!=null){
if(node1.val<=node2.val){
head.next=node1;
node1 = node1.next;
head = head.next;
}else{
head.next=node2;
node2 = node2.next;
head = head.next;
}
}
if(node1!=null){
head.next=node1;
}
if(node2!=null){
head.next=node2;
}
return result;
}
}
(二)
创建小顶堆
java
PriorityQueue<Integer> minHeap = new PriorityQueue<>();
自定义元素的优先级
java
PriorityQueue<Integer> minHeap = new PriorityQueue<>((a, b) -> a - b);
在PriorityQueue中,当调用poll()方法时,会返回堆顶元素并将其从堆中移除,保持堆的性质。当调用add()方法时,会将元素加入到堆中并保持堆的性质
java
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param lists ListNode类ArrayList
* @return ListNode类
*/
public ListNode mergeKLists (ArrayList<ListNode> lists) {
Queue<ListNode> minHeap = new PriorityQueue<>((v1,v2) -> v1.val-v2.val);
for(int i = 0;i<lists.size();i++){
if(lists.get(i)!=null){
minHeap.add(lists.get(i));
}
}
ListNode node = new ListNode(-1);
ListNode head = node;
while(!minHeap.isEmpty()){
ListNode min = minHeap.poll();
head.next = min;
head = head.next;
if(min.next!=null){
minHeap.add(min.next);
}
}
return node.next;
}
}