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; } }