題目:
合并 k 個(gè)排序鏈表劲赠,返回合并后的排序鏈表财著。請(qǐng)分析和描述算法的復(fù)雜度。
- 示例:
輸入:
[
1->4->5,
1->3->4,
2->6
]
輸出: 1->1->2->3->4->4->5->6
解析
參考?xì)w并排序耀态,采用分治策略
實(shí)現(xiàn)
java實(shí)現(xiàn)瘩燥,運(yùn)行時(shí)長2ms
/**
* MergeKLists
* src: https://leetcode-cn.com/problems/merge-k-sorted-lists/submissions/
* Date: 2019/11/18
* Description: 23-合并K個(gè)排序鏈表
*/
public class MergeKLists {
public static void main(String[] args) {
MergeKLists test = new MergeKLists();
int[][] data = {
{1,4,5},{1,3,4},{2,6}
};
test.mergeKLists(batchArrayToList(data));
}
public ListNode mergeKLists(ListNode[] lists) {
return mergeSort(lists, 0, lists.length - 1);
}
/**
* 合并多個(gè)鏈表,思路來源于 歸并排序, 使用遞歸分解問題正林,最后再合并
* @param lists 原始鏈表集合
* @param p 起始節(jié)點(diǎn)
* @param r 末尾節(jié)點(diǎn)
* @return 合并結(jié)果
*/
public ListNode mergeSort(ListNode[] lists, int p, int r) {
if (p == r) return lists[p];
if (p < r) {
int q = (p + r) / 2;
ListNode left = mergeSort(lists, p, q);
ListNode right = mergeSort(lists, q + 1, r);
return merge(left, right);
}
return null;
}
/**
* 合并鏈表泡一, 思路來源于歸并排序中的merge方法
* @param first
* @param second
* @return
*/
public ListNode merge(ListNode first, ListNode second) {
if (first == null) return second;
else if (second == null) return first;
ListNode header = first, firstLast = first, temp;
// 避免在迭代中一直判斷 first == last, 直接判斷后交換位置
if (first.val > second.val) {
temp = first;
first = second;
second = temp;
header = first;
}
while (second != null) {
// first 為空時(shí),直接拼接second剩余部分
if (first == null ) {
firstLast.next = second;
break;
}
if (first.val <= second.val) {
firstLast = first;
first = first.next;
continue;
}
firstLast.next = second;
temp = second.next;
second.next = first;
firstLast = second;
second = temp;
}
// printListNode(header);
return header;
}
/**
* 輔助測(cè)試:數(shù)組轉(zhuǎn)鏈表
* @param arr
* @return
*/
static ListNode arrayToList(int[] arr) {
if (arr == null || arr.length == 0) return null;
ListNode header = new ListNode(arr[0]);
ListNode temp = header;
for (int i = 1; i < arr.length; i++) {
temp.next = new ListNode(arr[i]);
temp = temp.next;
}
return header;
}
/**
* 輔助測(cè)試:矩陣轉(zhuǎn)鏈表數(shù)組
* @param arrList
* @return
*/
static ListNode[] batchArrayToList(int[][] arrList) {
ListNode[] list = new ListNode[arrList.length];
int i = 0;
for (int[] arr : arrList) {
list[i++] = arrayToList(arr);
}
return list;
}
/**
* 打印鏈表到控制臺(tái)
* @param header
*/
static void printListNode(ListNode header) {
System.out.print('[');
while (header != null) {
System.out.print(header.val + "->");
header = header.next;
}
System.out.println(']');
}
/**
* 鏈表類
*/
private static class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
}
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/merge-k-sorted-lists