给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
示例 1:
输入:lists = [[1,4,5],[1,3,4],[2,6]]
输出:[1,1,2,3,4,4,5,6]
import java.util.ArrayList;
请你将所有链表合并到一个升序链表中,返回合并后的链表。
输入:lists = [[1,4,5],[1,3,4],[2,6]]
//方法一 将链表数组转化数据都加入到一个Integer的Arraylist 排序之后,在创建一个链表返回 时间复杂度可空间复杂度都是O(mn)
public static ListNode mergeKLists(ListNode[] lists) {
List<ListNode> allDataList = new ArrayList<>();
for(ListNode node:lists){
allDataList.sort((s1,s2)->(s1.val-s2.val));
if(allDataList.size()==0){
ListNode res = new ListNode(0);
ListNode node = allDataList.get(0);
for(int i = 0;i<allDataList.size();i++){
node = allDataList.get(i);
if(i<=allDataList.size()-2){
node.next=allDataList.get(i+1);
if(i==allDataList.size()-1){
// 方法二,分治法,之前有做个两个升序链表的合并,这样就另外用排序算法中的分治法来处理数组中的链表
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;
l1.next = mergeTwoLists(l1.next, l2);
l2.next = mergeTwoLists(l1,l2.next);
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]);
ListNode res = mergeKLists(lists);
ListNode.printListData(res);

harryptter / LeetcodeTop100 · GitCode