LeetCode题解-合并K个有序数组-Java

简介: 合并K个有序数组-Java

利用21题合并两个有序数组的代码,使用for循环进行合并,效率较低;参照第一名的代码,使用分治,改变对数组的处理方法,可以大幅度提高处理效率:

修改后:

public ListNode mergeKLists(ListNode[] lists) {
   
        if(lists==null||lists.length==0)return null;
        return sort(lists, 0, lists.length-1);
    }
public static ListNode sort(ListNode[] lists ,int low , int high) {
   
        if(low>=high) return lists[low];
        int mid = (high - low )/2 + low;
        ListNode l1 = sort(lists ,low , mid);
        ListNode l2 = sort(lists , mid +1 ,high);
        return mergeTwoLists(l1, l2);
}

原:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
   
    public ListNode mergeKLists(ListNode[] lists) {
   
        int length = lists.length;
        if(length==0)return null;
        if(length==1)return lists[0];
        ListNode result = lists[0];
        for(int i = 1 ;i < length; i++) {
   
            result = mergeTwoLists(result, lists[i]);
        }
        return result;
    }
    //重复节点值
    //default关键字修饰变量,在不同包时无法访问
    public static ListNode mergeTwoLists(ListNode l1, ListNode l2) {
   
        ListNode result = new ListNode(0);
        ListNode point = result;
        //{5,1 2 4}
        while(l1!=null&&l2!=null) {
   
                if(l1.val>l2.val) {
   
                    point.next = new ListNode(l2.val);
                    point = point.next;
                    if(l2.next==null||l2.next.val>l1.val) {
   
                        point.next = new ListNode(l1.val);
                        point=point.next;
                        l1=l1.next;
                    }
                    l2=l2.next;
                }else if(l1.val<l2.val){
   
                    point.next = new ListNode(l1.val);
                    point = point.next;
                    if(l1.next==null||l1.next.val>l2.val) {
   
                        point.next = new ListNode(l2.val);
                        point=point.next;
                        l2=l2.next;
                    }
                    l1=l1.next;
                }else {
   
                    point.next = new ListNode(l2.val);
                    point=point.next;
                    point.next = new ListNode(l2.val);
                    point=point.next;
                    l1=l1.next;
                    l2=l2.next;
                }
        }
        while(l1!=null) {
   
            point.next = new ListNode(l1.val);
            point = point.next;
            l1=l1.next;
        }
        while(l2!=null) {
   
            point.next = new ListNode(l2.val);
            point = point.next;
            l2=l2.next;
        }
        return result.next;
    }

}
目录
相关文章
|
1月前
|
Go 索引 Perl
【LeetCode 热题100】【二叉树构造题精讲:前序 + 中序建树 & 有序数组构造 BST】(详细解析)(Go语言版)
本文详细解析了二叉树构造的两类经典问题:通过前序与中序遍历重建二叉树(LeetCode 105),以及将有序数组转化为平衡二叉搜索树(BST,LeetCode 108)。文章从核心思路、递归解法到实现细节逐一拆解,强调通过索引控制子树范围以优化性能,并对比两题的不同构造逻辑。最后总结通用构造套路,提供进阶思考方向,帮助彻底掌握二叉树构造类题目。
119 9
|
7月前
leetCode(删除有序数组中的重复项)
如何在不使用额外空间的情况下,通过双指针法原地删除有序数组中的重复项。
66 2
|
9月前
|
存储 Java API
LeetCode------合并两个有序数组(4)【数组】
这篇文章介绍了LeetCode上的"合并两个有序数组"问题,并提供了三种解法:第一种是使用Java的Arrays.sort()方法直接对合并后的数组进行排序;第二种是使用辅助数组和双指针技术进行合并;第三种则是从后向前的双指针方法,避免了使用额外的辅助数组。
LeetCode------合并两个有序数组(4)【数组】
|
9月前
|
算法
LeetCode第26题删除有序数组中的重复项
这篇文章介绍了LeetCode第26题"删除有序数组中的重复项"的解题方法,通过使用双指针技巧,高效地去除数组中的相邻重复元素。
LeetCode第26题删除有序数组中的重复项
|
9月前
|
算法
LeetCode第80题删除有序数组中的重复项 II
文章介绍了LeetCode第80题"删除有序数组中的重复项 II"的解法,利用双指针技术在O(1)空间复杂度内原地删除重复元素,并总结了双指针技术在处理有序数组问题中的应用。
LeetCode第80题删除有序数组中的重复项 II
|
7月前
【LeetCode 48】108.将有序数组转换为二叉搜索树
【LeetCode 48】108.将有序数组转换为二叉搜索树
80 0
|
7月前
|
算法 Java
LeetCode(一)Java
LeetCode(一)Java
|
9月前
|
算法
LeetCode第88题合并两个有序数组
文章分享了LeetCode第88题"合并两个有序数组"的解法,通过从后向前的合并策略避免了数组元素的前移,使用三个指针高效地完成了合并过程。
|
9月前
|
算法 Java
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
108 6
|
9月前
|
存储 算法 Java
LeetCode经典算法题:打家劫舍java详解
LeetCode经典算法题:打家劫舍java详解
111 2