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;
    }

}
目录
相关文章
|
21天前
leetCode(删除有序数组中的重复项)
如何在不使用额外空间的情况下,通过双指针法原地删除有序数组中的重复项。
30 2
|
3月前
|
存储 Java API
LeetCode------合并两个有序数组(4)【数组】
这篇文章介绍了LeetCode上的"合并两个有序数组"问题,并提供了三种解法:第一种是使用Java的Arrays.sort()方法直接对合并后的数组进行排序;第二种是使用辅助数组和双指针技术进行合并;第三种则是从后向前的双指针方法,避免了使用额外的辅助数组。
LeetCode------合并两个有序数组(4)【数组】
|
20天前
【LeetCode 48】108.将有序数组转换为二叉搜索树
【LeetCode 48】108.将有序数组转换为二叉搜索树
34 0
|
21天前
|
算法 Java
LeetCode(一)Java
LeetCode(一)Java
|
3月前
|
算法
LeetCode第26题删除有序数组中的重复项
这篇文章介绍了LeetCode第26题"删除有序数组中的重复项"的解题方法,通过使用双指针技巧,高效地去除数组中的相邻重复元素。
LeetCode第26题删除有序数组中的重复项
|
3月前
|
算法
LeetCode第80题删除有序数组中的重复项 II
文章介绍了LeetCode第80题"删除有序数组中的重复项 II"的解法,利用双指针技术在O(1)空间复杂度内原地删除重复元素,并总结了双指针技术在处理有序数组问题中的应用。
LeetCode第80题删除有序数组中的重复项 II
|
3月前
|
算法
LeetCode第88题合并两个有序数组
文章分享了LeetCode第88题"合并两个有序数组"的解法,通过从后向前的合并策略避免了数组元素的前移,使用三个指针高效地完成了合并过程。
|
3月前
|
算法 Java
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
49 6
|
3月前
|
存储 算法 Java
LeetCode经典算法题:打家劫舍java详解
LeetCode经典算法题:打家劫舍java详解
64 2
|
3月前
|
人工智能 算法 Java
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
47 1