题目描述

合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。

示例:

  1. 输入:
  2. [
  3. 1->4->5,
  4. 1->3->4,
  5. 2->6
  6. ]
  7. 输出: 1->1->2->3->4->4->5->6

题解

递归 + MergeTwo

时间复杂度是 O(log(k) k n),k 是 lists 中的 ListNode 数,n 是所有 ListNode 的平均长度。

  1. public ListNode MergeKLists(ListNode[] lists)
  2. {
  3. if (lists == null || lists.Length == 0) return null;
  4. return PartionMerge(lists, 0, lists.Length - 1);
  5. }
  6. private ListNode PartionMerge(ListNode[] lists, int low, int high)
  7. {
  8. if (low >= high) return lists[low];
  9. var mid = low + (high - low) / 2;
  10. var l1 = PartionMerge(lists, low, mid);
  11. var l2 = PartionMerge(lists, mid + 1, high);
  12. return MergeTwoLists(l1, l2);
  13. }
  14. public ListNode MergeTwoLists(ListNode l1, ListNode l2)
  15. {
  16. if (l1 == null) return l2;
  17. if (l2 == null) return l1;
  18. if (l1.val < l2.val)
  19. {
  20. l1.next = MergeTwoLists(l1.next, l2);
  21. return l1;
  22. }
  23. l2.next = MergeTwoLists(l1, l2.next);
  24. return l2;
  25. }