题解 | #合并k个已排序的链表# 分治策略+多路递归
合并k个已排序的链表
https://www.nowcoder.com/practice/65cfde9e5b9b4cf2b6bafa5f3ef33fa6
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* public ListNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 思路:分治策略+多路递归
* 将链表集合根据索引拆分两部分,递归进行不断拆分两部分链表,直到拆分到两部分都只剩一个链表
* 这时可以合并两个链表,最后返回的就是多个链表合并后的结果
*
* @param lists ListNode类ArrayList
* @return ListNode类
*/
public ListNode mergeKLists (ArrayList<ListNode> lists) {
if(lists.size() == 0){
return null;
}
return split(lists,0,lists.size() - 1 );
}
public ListNode split(ArrayList<ListNode> lists, int i, int j){
//治
if(i == j){
return lists.get(i);
}
//分
int m = (i + j) >>> 1; //中间索引
ListNode p1 = split(lists,i,m);
ListNode p2 = split(lists,m+1,j);
//合
return merge(p1,p2);
}
//合并两个链表
public ListNode merge(ListNode p1, ListNode p2){
if(p1 == null){
return p2;
}
if(p2 == null){
return p1;
}
if(p1.val < p2.val){
p1.next = merge(p1.next,p2);
return p1;
}else{
p2.next = merge(p1,p2.next);
return p2;
}
}
}
基恩士成长空间 439人发布
