每日刷题之合并k个升序数组(牛客)

文章目录

    • 思路
    • 代码
    • 复杂度
    • 结语

✅作者简介:我是18shou,一名即将秋招的java实习生

系列专栏:牛客面经专栏

推荐一款八股、面经、模拟面试、刷题神器 超级无敌牛逼之牛客
每日刷题之合并k个升序数组(牛客)_第1张图片
此题需要先掌握合并俩个有序链表

思路

将 k 个链表配对并将同一对中的链表合并;
第一轮合并以后, k 个链表被合并成了 k/2​ 个链表,平均长度为 2n/k​,然后是 k/4​ 个链表, k/8个链表等等;
重复这一过程,直到我们得到了最终的有序链表。

代码

import java.util.*;
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */

public class Solution {
    ListNode ans;
    public ListNode mergeKLists(ArrayList lists) {
        return merge(lists, 0, lists.size() - 1);
    }
     public ListNode merge(ArrayList lists, int l, int r) {
        if (l == r) {
            return lists.get(l);
        }
        if (l > r) {
            return null;
        }
        int mid = l + (r - l) / 2;
        ListNode left = merge(lists, l, mid);
        ListNode right = merge(lists, mid + 1, r);
        return mergeTwoLists(left,right);
    }
    public ListNode mergeTwoLists(ListNode list1,ListNode list2) {
        ListNode l1= list1;
        ListNode l2 = list2;
        ListNode head = new ListNode(-1);
        ListNode cur = head;
        while(l1 != null && l2 !=null) {
            if(l1.val > l2.val) {
                cur.next = l2;
                l2 = l2.next;
            }else{
                cur.next = l1;
                l1 = l1.next;
            }
            cur = cur.next;
        }
        if(l1 != null) {
            cur.next = l1;
        }
        if(l2 != null) {
            cur.next = l2;
        }
        return head.next;
    }
}

每日刷题之合并k个升序数组(牛客)_第2张图片

复杂度

时间:O(kn×logk)
空间:O(logk)

结语

兄弟们,一起来刷题嘎嘎的写题

你可能感兴趣的:(java,基础,算法,链表,数据结构,java)