題目地址:https://leetcode.com/problems/merge-k-sorted-lists/spa
題目解析:採用二分歸併法,將鏈表分爲兩部分,兩部分合並後再將結果合併;對其中的每一部分的合併採用遞歸的方法進行。code
題目解答:blog
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */ public class Solution { public ListNode mergeKLists(List<ListNode> lists) { if(lists == null || lists.size() == 0){ return null; } return mergeKLists(lists,0,lists.size() - 1); } private ListNode mergeKLists(List<ListNode> lists,int start,int end){ if(start == end){ return lists.get(start); } if((end - start) == 1){ return mergeTwoLists(lists.get(start),lists.get(end)); } ListNode left = mergeKLists(lists,start,(start+end)/2); ListNode right = mergeKLists(lists,(start+end)/2+1,end); return mergeTwoLists(left,right); } private ListNode mergeTwoLists(ListNode first,ListNode second){ if(first == null){ return second; } if(second == null){ return first; } ListNode ret = null; if(first.val <= second.val){ ret = first; first = first.next; }else{ ret = second; second = second.next; } ListNode insert = ret; while(first!=null && second!=null){ if(first.val <= second.val){ insert.next = first; first = first.next; }else{ insert.next = second; second = second.next; } insert = insert.next; insert.next= null; } insert.next = (first == null ? second:first); return ret; } }