当前位置:  首页>> 技术小册>> 数据结构与算法(中)

难度: Hard

内容描述

  1. 合并k个已排序的链表,并将其作为一个已排序的列表返回。分析并描述其复杂性。
  2. Example:
  3. Input:
  4. [
  5. 1->4->5,
  6. 1->3->4,
  7. 2->6
  8. ]

解题方案

思路 1
*- 时间复杂度:O(NlogK) *- 空间复杂度:O(N)*

K为链表的数量,N为所有链表的节点的总个数

此题在于一分一合,将K个有序链表通过二分,拆成两两一组的链表,就变成了leetcode 21题中的合并两个有序链表了,随后将所有链表逐层合并,就像从二叉树的叶子节点开始,不断向上合并,此题就求解完毕了。

此题需要用到的技巧就是二分,以及递归合并两个有序链表(当然迭代合并两个有序列表也是可以的)

Beats 100%

  1. public ListNode mergeKLists(ListNode[] lists) {
  2. if (lists == null || lists.length == 0) return null;
  3. return sort(lists, 0, lists.length - 1);
  4. }
  5. // 二分K个链表
  6. ListNode sort(ListNode[] lists, int lo, int hi) {
  7. if (lo >= hi) return lists[lo];
  8. int mid = (hi -lo) / 2 + lo;
  9. ListNode l1 = sort(lists, lo, mid);
  10. ListNode l2 = sort(lists, mid + 1, hi);
  11. return merge(l1, l2);
  12. }
  13. // 合并两个有序链表的递归写法
  14. ListNode merge(ListNode l1, ListNode l2) {
  15. if (l1 == null) return l2;
  16. if (l2 == null) return l1;
  17. if (l1.val < l2.val) {
  18. l1.next = merge(l1.next, l2);
  19. return l1;
  20. }
  21. l2.next = merge(l2.next, l1);
  22. return l2;
  23. }

该分类下的相关小册推荐: