LeetCode 第23题 合并K个排序链表

Posted _colorful

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 第23题 合并K个排序链表相关的知识,希望对你有一定的参考价值。


/*

23. 合并K个排序链表


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

示例:

输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
*/

/**
* Definition for singly-linked list. public class ListNode { int val; ListNode next; ListNode(int
* x) { val = x; } }
*/

/*
思路1: 分治法,归并排序
思路2: 优先队列
*/


 1 class Solution23 {
 2 
 3   /*
 4   分治法,归并排序.
 5    */
 6   public ListNode mergeKLists(ListNode[] lists) {
 7     if (lists == null || lists.length == 0) {
 8       return null;
 9     }
10     return sort(lists, 0, lists.length - 1);
11   }
12 
13   ListNode sort(ListNode[] list, int left, int right) {
14     if (left < right) {
15       int mid = (left + right) >> 1;
16       ListNode le = sort(list, left, mid);
17       ListNode ri = sort(list, mid + 1, right);
18       return merge(le, ri);
19     }
20     return list[left];
21   }
22 
23   ListNode merge(ListNode le, ListNode ri) {
24     if (le == null) {
25       return ri;
26     }
27     if (ri == null) {
28       return le;
29     }
30     if (le.val < ri.val) {
31       le.next = merge(le.next, ri);
32       return le;
33     } else {
34       ri.next = merge(le, ri.next);
35       return ri;
36     }
37   }
38 
39   /*
40     优先队列式.
41    */
42   public ListNode mergeKLists2(ListNode[] lists) {
43 
44     if (lists == null || lists.length == 0) {
45       return null;
46     }
47     if (lists.length == 1) {
48       return lists[0];
49     }
50     PriorityQueue<ListNode> queue = new PriorityQueue<>(Comparator.comparingInt(o -> o.val));
51     for (ListNode list : lists) {
52       if (list != null) {
53         queue.add(list);
54       }
55     }
56     ListNode dummy = new ListNode(0);
57     ListNode curr = dummy;
58     while (!queue.isEmpty()) {
59       curr.next = queue.poll();
60       curr = curr.next;
61       if (curr.next != null) {
62         queue.add(curr.next);
63       }
64     }
65     return dummy.next;
66   }
67 }

 



以上是关于LeetCode 第23题 合并K个排序链表的主要内容,如果未能解决你的问题,请参考以下文章

[leetcode] 23. 合并K个排序链表

精选力扣500题 第18题 LeetCode 23. 合并K个升序链表c++详细题解

LeetCode-23. 合并K个排序链表

leetcode23.合并K个排序链表

每天AC系列:合并K个排序链表

leetcode.23合并 k 个排序链表