Merge k Sorted Lists 解答

Question

Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.

Solution 1 -- Merge Sort

We can follow the method of merge sort. Time complexity O(nlog(n)), n is the total number of all nodes.

 1 /**
 2  * Definition for singly-linked list.
 3  * public class ListNode {
 4  *     int val;
 5  *     ListNode next;
 6  *     ListNode(int x) { val = x; }
 7  * }
 8  */
 9 public class Solution {
10     public ListNode mergeKLists(ListNode[] lists) {
11         if (lists == null || lists.length < 1)
12             return null;
13         if (lists.length == 1)
14             return lists[0];
15         int k = lists.length;
16         return MSort(lists, 0, k - 1);
17     }
18     
19     private ListNode MSort(ListNode[] lists, int start, int end) {
20         if (start < end) {
21             int mid = (end - start) / 2 + start;
22             ListNode left = MSort(lists, start, mid);
23             ListNode right = MSort(lists, mid + 1, end);
24             return mergeTwoLists(left, right);
25         }
26         return lists[start];
27     }
28     
29     private ListNode mergeTwoLists(ListNode a, ListNode b) {
30         ListNode newHead = new ListNode(0);
31         ListNode p = newHead, p1 = a, p2 = b;
32         while (p1 != null && p2 != null) {
33             if (p1.val < p2.val) {
34                 p.next = new ListNode(p1.val);
35                 p1 = p1.next;
36             } else {
37                 p.next = new ListNode(p2.val);
38                 p2 = p2.next;
39             }
40             p = p.next;
41         }
42         while (p1 != null) {
43             p.next = new ListNode(p1.val);
44             p1 = p1.next;
45             p = p.next;
46         }
47         while (p2 != null) {
48             p.next = new ListNode(p2.val);
49             p2 = p2.next;
50             p = p.next;
51         }
52         return newHead.next;
53     }
54 }

Solution 2 -- PriorityQueue

We can use PriorityQueue in Java. The elements of the priority queue are ordered according to their natural ordering, or by a comparator provided at the construction time.

PriorityQueue

Comparator

 1 /**
 2  * Definition for singly-linked list.
 3  * public class ListNode {
 4  *     int val;
 5  *     ListNode next;
 6  *     ListNode(int x) { val = x; }
 7  * }
 8  */
 9 public class Solution {
10     public ListNode mergeKLists(ListNode[] lists) {
11         if (lists == null || lists.length < 1)
12             return null;
13         ListNode newHead = new ListNode(0);
14         PriorityQueue<ListNode> pq = new PriorityQueue<ListNode>(lists.length,
15                                             new Comparator<ListNode>() {
16                                                 public int compare(ListNode a, ListNode b) {
17                                                     return (a.val - b.val);
18                                                 }});
19         for (ListNode tmp : lists) {
20             if (tmp != null)
21                 pq.add(tmp);
22         }
23         ListNode p = newHead;
24         while (pq.size() > 0) {
25             ListNode tmp = pq.poll();
26             p.next = tmp;
27             if (tmp.next != null)
28                 pq.add(tmp.next);
29             p = p.next;
30         }
31         return newHead.next;
32     }
33 }
原文地址:https://www.cnblogs.com/ireneyanglan/p/4827841.html