题解 | #合并k个已排序的链表#
合并k个已排序的链表
https://www.nowcoder.com/practice/65cfde9e5b9b4cf2b6bafa5f3ef33fa6
1、找中间值,把传入的集合链表分为左右俩部分
2、递归二分这个集合,最后,会得到一个元素不能再分。
3、再利用俩个链表顺序合并的方法,把第一个和第二个不能再分的链表合并,并依次三个和第四个合并。。。
4、最后就得到了k个已排序的链表合并结果。
import java.util.*; /* * public class ListNode { * int val; * ListNode next = null; * public ListNode(int val) { * this.val = val; * } * } */ public class Solution { public ListNode mergeKLists (ArrayList<ListNode> lists) { // write code here return mergeKList(lists, 0, lists.size() - 1); } public ListNode mergeKList(ArrayList<ListNode> lists, int left,int right){ // 递归终点 if(left == right){ return lists.get(left); } if(left > right){ return null; } // 取中间值 >> 1 右移1位表示 / 2^1 int mid = left + ((right - left) >> 1); // 递归调用到最基础的俩俩合并 // 分治左右,实现list中的节点元素可以呈树形俩俩合并,实现logn,配合俩俩合并,总时间复杂度nlogn return merge(mergeKList(lists,left,mid),mergeKList(lists,mid+1,right)); } // 俩个链表合并 (基础) public ListNode merge(ListNode l1, ListNode l2){ if(l1 == null || l2 == null){ return l1 == null ? l2 : l1; } // 返回节点 ListNode dummy = new ListNode(-1); // 操作节点 ListNode cur = dummy; while(l1 != null && l2 != null){ if(l1.val < l2.val){ cur.next = l1; l1 = l1.next; }else{ cur.next = l2; l2 = l2.next; } cur = cur.next; } // 补齐剩下未合并完的链 cur.next = (l1 == null ? l2 : l1); return dummy.next; } }#链表合并#