合并k个已排序的链表---困难

简介: 合并k个已排序的链表---困难

题目描述:


合并 k 个升序的链表并将结果作为一个升序的链表返回其头节点。


范围:


节点总数>=0  、链表个数 >= 1 、 链表长度 >= 1


示例1:


输入:[{1,2,3},{4,5,6,7}]


返回值:{1,2,3,4,5,6,7}


示例2:


输入:[{1,2},{1,4,5},{6}]


返回值:{1,1,2,4,5,6}


初始代码:

import java.util.*;
public class Solution {
    public ListNode mergeKLists(ArrayList<ListNode> lists) {
    }
}

解决思路:


1、先写一个功能函数merge,能够将两个有序链表合并成一个有序链表

2、按照顺序 一个个合并每一个链表!


失误点:时间复杂度过高!代码运算超时!


如何解决:  利用归并的思想!


  • step 1:从链表数组的首和尾开始,每次划分从中间开始划分,划分成两半,得到左边n/2个链表和右边n/2个链表。
  • step 2:继续不断递归划分,直到每部分链表数为1.
  • step 3:将划分好的相邻两部分链表,按照两个链表合并的方式合并,合并好的两部分继续往上合并,直到最终合并成一个链表。
import java.util.*;
public class Solution {
    private ListNode merge(ListNode list1, ListNode list2) {
        if (list1 == null && list2 == null) {
            return null;
        } else if (list1 != null && list2 == null) {
            return list1;
        } else if (list1 == null) {
            return list2;
        }
        ListNode ret = new ListNode(0);
        ListNode cur = ret;
        while (list1 != null && list2 != null) {
            if (list1.val <= list2.val) {
                ListNode node = new ListNode(list1.val);
                cur.next = node;
                list1 = list1.next;
            } else {
                ListNode node = new ListNode(list2.val);
                cur.next = node;
                list2 = list2.next;
            }
            cur = cur.next;
        }
        if (list1 == null) {
            cur.next = list2;
        } else {
            cur.next = list1;
        }
        return ret.next;
    }
//!!时间超时的原本代码
    //    public ListNode mergeKLists(ArrayList<ListNode> lists) {
//        if (lists.isEmpty()){
//            return null;
//        }
//        ListNode[] arr = new ListNode[lists.size()];
//        lists.toArray(arr);
//        int index = arr.length;
//        ListNode ret = merge(arr[index-1],arr[index-2]);
//        index-=3;
//        while(index>=0){
//            ret=merge(ret,arr[index]);
//            index--;
//        }
//        return ret;
//    }
//下面是改进后的代码
    public ListNode mergeKLists(ArrayList<ListNode> lists) {
        ListNode[] arr = new ListNode[lists.size()];
        lists.toArray(arr);
        return merge1(arr, 0, arr.length - 1);
    }
    private ListNode merge1(ListNode[] arr, int left, int right) {
        if (left>right){
            return null;
        }else if (left==right){
            return arr[left];
        }
        int mid = (left+right)/2;
//重点要读懂这一句!!
        return merge(merge1(arr,left,mid),merge1(arr,mid+1,right));
    }
}


相关文章
|
27天前
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
43 0
|
1月前
|
算法
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
30 0
|
3月前
|
存储 算法
LeetCode第83题删除排序链表中的重复元素
文章介绍了LeetCode第83题"删除排序链表中的重复元素"的解法,使用双指针技术在原链表上原地删除重复元素,提供了一种时间和空间效率都较高的解决方案。
LeetCode第83题删除排序链表中的重复元素
|
3月前
|
存储 算法 Java
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
43 0
|
5月前
23.合并K个升序链表
23.合并K个升序链表
|
5月前
|
存储 SQL 算法
LeetCode 83题:删除排序链表中的重复元素【面试】
LeetCode 83题:删除排序链表中的重复元素【面试】
|
5月前
|
存储 SQL 算法
LeetCode 题目 82:删除排序链表中的重复元素 II
LeetCode 题目 82:删除排序链表中的重复元素 II
|
5月前
|
存储 算法 数据挖掘
Leetcode二十三题:合并K个升序链表【22/1000 python】
Leetcode二十三题:合并K个升序链表【22/1000 python】
|
6月前
【移除链表元素】LeetCode第203题讲解
【移除链表元素】LeetCode第203题讲解
|
5月前
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表