23. Merge k Sorted Lists

题目

Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.

Example:

Input:
[
1->4->5,
1->3->4,
2->6
]
Output: 1->1->2->3->4->4->5->6

题目大意

合并 K 个有序链表

解题思路

  • 思路:

  • 递归,两两合并

  • 遍历链表数组–>定义一个合并方法(21答案)

代码

public ListNode mergeKLists(ListNode[] lists) {
        ListNode listNodeTemp = null;
        if (lists != null) {
            for (ListNode list :
                    lists) {
                listNodeTemp = mergeTwoLists(list, listNodeTemp);
            }
            return listNodeTemp;
        }
       return null;
    }

    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        if (l1 == null) {
            return l2;
        } else if (l2 == null) {
            return l1;
        } else if (l1.val < l2.val) {
            l1.next = mergeTwoLists(l1.next, l2);
            return l1;
        } else {
            l2.next = mergeTwoLists(l1, l2.next);
            return l2;
        }
    } 

复杂度分析

时间复杂度:假设每个链表的最长长度是n。在第一次合并后, ans的长度为n ;第二次合并后,ans的长度为 2n,第i 次合并后,ans的长度为in。第i次合并的时间代价是O(n+(i-1)n)=O(i*n) ,那么总的时间代价为 O(\sum_{i=1}^{k}(i\times k))=O(\frac{(1+k)k}{2}\times n)=O(k^{2}n),故渐进时间复杂度为 O(k^{2}n)

空间复杂度:没有用到与 k n 规模相关的辅助空间,故渐进空间复杂度为 O(1)

Leave a Comment

您的电子邮箱地址不会被公开。 必填项已用 * 标注