Merge k Sorted Lists
当初看到这题的第一反应是每次都遍历一遍所有头节点,然后选出最小的连接到已排序链表的末尾。这个想法当然能够解决问题,但是性能上肯定是过不去的。因为这样相当于没排序一个元素就是需要比较m
次(m
为链表条数),那么最后的复杂度就是O(nm)
(n
为元素总数)。
那么更加高效的办法就是对链表进行两两合并,两条链表的合并复杂度为O(l + k)
,l
和k
分别代表了两条链表的元素个数,那么最终的复杂度为O(n)
(n
为元素总数)。
实现代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| public class Solution { public ListNode mergeKLists(List<ListNode> lists) { if (lists.isEmpty()) return null; return merge(lists, 0, lists.size() - 1); }
public ListNode merge(List<ListNode> lists, int start, int end) { if (start == end) return lists.get(start); int mid = (start + end) / 2; ListNode one = merge(lists, start, mid); ListNode two = merge(lists, mid + 1, end); return mergeTwoLists(one, two); }
public ListNode mergeTwoLists(ListNode node1, ListNode node2) { ListNode head = new ListNode(-1), node = head; while (node1 != null && node2 != null) { if (node1.val < node2.val) { node.next = node1; node1 = node1.next; } else { node.next = node2; node2 = node2.next; } node = node.next; } if (node1 == null && node2 != null) { node.next = node2; } else if (node1 != null && node2 == null) { node.next = node1; } return head.next; } }
|