leetcode第23题合并K个升序链表

139 阅读1分钟

题目: 给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。 题目链接

我的JavaScript解法

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode[]} lists
 * @return {ListNode}
 */
var mergeKLists = function(lists) {
  return merge(lists, 0, lists.length - 1);
};

var merge = function(lists, l, r) {
  if (l == r) return lists[l];
  if (l > r) return null;
  let mid = (l + r) >> 1;
  return mergeTwoLists(merge(lists, l, mid), merge(lists, mid + 1, r));
}

var mergeTwoLists = function(list1, list2) {
  let head = new ListNode(-1), current = head;
  let p1 = list1, p2 = list2;
  while(p1 != null && p2 != null) {
    if (p1.val <= p2.val) {
      current.next = p1;
      p1 = p1.next;
    } else {
      current.next = p2;
      p2 = p2.next;
    }
    current = current.next;
  }

  if(p1!=null) {
    current.next = p1;
  }
  if(p2!=null) {
    current.next = p2;
  }
  return head.next;
};

解析: 归并排序(分治法)

  • 时间复杂度:「向上回升」的过程——第一轮合并 k2\frac{k}{2} 组链表,每一组的时间代价是O(2n)O(2n);第二轮合并 k4\frac{k}{4} 组链表,每一组的时间代价是 O(4n)O(4n)......总的时间代价是 O(i=1k2i×2in)O(\sum_{i = 1}^{\infty} \frac{k}{2^i} \times 2^i n) = O(kn×logk),故渐进时间复杂度为O(kn \times \log k),故渐进时间复杂度为 O(kn×logk)$。

  • 空间复杂度:O(logk)O(logk)