k个链表归并(Leetcode23)

2018-11-07  本文已影响0人  zhouwaiqiang

题目要求

在21题的基础上,增长到k个有序链表,给定一个链表数组,将其归并,并分析其时间复杂度和空间复杂度。

解题思路

代码实现

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
        if (lists.length == 0) return null;
        int k = 1, length = lists.length;
        while (true) {
            for (int i=0; i<length; i=i+2*k) {
                if (i+k < length) {
                    lists[i] = mergeList(lists[i], lists[i+k]);
                }
            }
            k *= 2;
            if (k >= length) break;
        }
        return lists[0];
    }
    
    private ListNode mergeList(ListNode l1, ListNode l2) {
        if (l1 == null) return l2;
        if (l2 == null) return l1;
        if (l1.val < l2.val) {
            l1.next = mergeList(l1.next, l2);
            return l1;
        } else {
            l2.next = mergeList(l1, l2.next);
            return l2;
        }
    }
}

结果分析

leetcode给出的击败率88%,耗时9ms,时间和空间复杂度不太会分析暂时不弄了,但是整体的时间复杂度是O(n)级别的,空间复杂度略大。

简单归并链接

http://www.waiqiang.ren/2018/11/07/Leetcode21/

上一篇 下一篇

猜你喜欢

热点阅读