leetcode困难23合并K个升序链表

Posted qq_40707462

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode困难23合并K个升序链表相关的知识,希望对你有一定的参考价值。


思路:
假设K个链表,每个长度为n

  • 顺序遍历合并,在第一次合并后,ans 的长度为 n;第二次合并后,ans 的长度为 2×n,第 i 次合并后,ans 的长度为 i×n。总时间复杂度O(k^2 ×n)
  • 二分 / 归并,递归
    第一轮合并 k/2 组链表,每一组时间复杂度为 O(2n),第二轮合并 k/4 组链表
    每一组的时间代价是 O(4n)。总时间复杂度为O(kn×logk)。
class Solution 
    public ListNode mergeKLists(ListNode[] lists) 
        if(lists.length==0) return null;
        return helper(lists,0,lists.length-1);
    

    public ListNode helper(ListNode[] lists,int left,int right)
        if(left==right) return lists[left];
        int mid=(left+right)/2;
        ListNode l1=helper(lists,left,mid);
        ListNode l2=helper(lists,mid+1,right);
        return mergeTwo(l1,l2);
    

    public ListNode mergeTwo(ListNode l1,ListNode l2)
        ListNode pre=new ListNode();
        ListNode p=pre;
        while(l1!=null && l2!=null)
            if(l1.val<l2.val)
                p.next=l1;
                l1=l1.next;
            else
                p.next=l2;
                l2=l2.next;
            
            p=p.next;
        
        p.next= l1==null?l2:l1;
        return pre.next;
    

以上是关于leetcode困难23合并K个升序链表的主要内容,如果未能解决你的问题,请参考以下文章

23. 合并K个升序链表(困难)-归并排序小顶堆

算法leetcode|23. 合并K个升序链表(rust重拳出击)

算法leetcode|23. 合并K个升序链表(rust重拳出击)

LeetCode 23 合并K个升序链表

LeetCode 23 合并K个升序链表

Python描述 LeetCode 23. 合并K个升序链表