合并?k?個排序鏈表,返回合并后的排序鏈表。請分析和描述算法的復雜度。
示例:
輸入:
[
??1->4->5,
??1->3->4,
??2->6
]
輸出: 1->1->2->3->4->4->5->6
思路:把初始的每一個鏈表當成數組中的一個數,做數組的歸并排序。
遞歸的merge過程就是稍微慢一點,因為來回跳函數棧,所以你們看到只擊敗了90.
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/
class Solution {public ListNode mergeKLists(ListNode[] lists) {if(lists.length == 0) return null;return solve(lists, 0, lists.length-1);}private ListNode solve(ListNode[] arr, int left, int right){if(left == right) return arr[left];int mid = (left + right) >> 1; ListNode lNode = solve(arr, left, mid); ListNode rNode = solve(arr, mid+1, right); return merge(lNode, rNode);}private ListNode merge(ListNode node1, ListNode node2){if(node1 == null) return node2;if(node2 == null) return node1;if(node1.val < node2.val){node1.next = merge(node1.next, node2);return node1;}else{node2.next = merge(node1, node2.next);return node2;}}
}
?