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) {
return divide(lists, 0, lists.size() - 1);
}
// 这个是二分法
private ListNode divide(ArrayList<ListNode> lists, int left, int right) {
if (left > right) return null;
if (left == right) return lists.get(left);
int mid = (left + right) / 2;
// 分别进入左右,然后合并左右
return merge(divide(lists, left, mid), divide(lists, mid + 1, right));
}
// 合并方法
private ListNode merge(ListNode p1, ListNode p2) {
if (p1 == null) return p2;
if (p2 == null) return p1;
ListNode cur1 = p1;
ListNode cur2 = p2;
ListNode result = new ListNode(-2222);
// 遍历链表需要当前指针,千万不能忽略。
ListNode cur3 = result;
while (cur1 != null && cur2 != null) {
if (cur1.val <= cur2.val) {
cur3.next = cur1;
cur1 = cur1.next;
} else {
cur3.next = cur2;
cur2 = cur2.next;
}
cur3 = cur3.next;
}
if (cur1 != null) {
cur3.next = cur1;
} else {
cur3.next = cur2;
}
return result.next;
}
}