给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
示例 1:
输入:lists = [[1,4,5],[1,3,4],[2,6]]
输出:[1,1,2,3,4,4,5,6]
package Top31_40;
import Util.ListNode;
import java.util.ArrayList;
import java.util.List;
// 合并 K 个升序链表
/*
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
示例 1:
输入:lists = [[1,4,5],[1,3,4],[2,6]]
输出:[1,1,2,3,4,4,5,6]
*/
public class Top32 {
//方法一 将链表数组转化数据都加入到一个Integer的Arraylist 排序之后,在创建一个链表返回 时间复杂度可空间复杂度都是O(mn)
public static ListNode mergeKLists(ListNode[] lists) {
if(lists.length == 0){
return null;
}
List<ListNode> allDataList = new ArrayList<>();
for(ListNode node:lists){
while (node!=null){
allDataList.add(node);
node = node.next;
}
}
allDataList.sort((s1,s2)->(s1.val-s2.val));
if(allDataList.size()==0){
return null;
}
ListNode res = new ListNode(0);
ListNode node = allDataList.get(0);
for(int i = 0;i<allDataList.size();i++){
node = allDataList.get(i);
if(i ==0){
res.next = node;
}
if(i<=allDataList.size()-2){
node.next=allDataList.get(i+1);
}
if(i==allDataList.size()-1){
node.next = null;
}
}
return res.next;
}
// 方法二,分治法,之前有做个两个升序链表的合并,这样就另外用排序算法中的分治法来处理数组中的链表
//分治法合并链表数组
public ListNode divideMergeKLists(ListNode[] lists) {
if (lists == null || lists.length == 0) return null;
return merge(lists, 0, lists.length - 1);
}
private ListNode merge(ListNode[] lists, int left, int right) {
if (left == right) return lists[left];
int mid = left + (right - left) / 2;
ListNode l1 = merge(lists, left, mid);
ListNode l2 = merge(lists, mid + 1, right);
return mergeTwoLists(l1, l2);
}
// 合并两个链表
private ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if (l1 == null) return l2;
if (l2 == null) return l1;
if (l1.val < l2.val) {
l1.next = mergeTwoLists(l1.next, l2);
return l1;
} else {
l2.next = mergeTwoLists(l1,l2.next);
return l2;
}
}
public static void main(String[] args) {
int[][] nums = {{1,4,5},{1,3,4},{2,6}};
ListNode[] lists = new ListNode[nums.length];
for(int i =0;i<nums.length;i++){
ListNode node = ListNode.setNodes(0,nums[i]);
lists[i] = node;
}
ListNode res = mergeKLists(lists);
ListNode.printListData(res);
}
}
harryptter / LeetcodeTop100 · GitCode