1. 程式人生 > >leetcode-23. Merge k Sorted Lists

leetcode-23. Merge k Sorted Lists

題目型別:

連結串列、分治、歸併

21題的變式

題意:

合併k個已排序的連結串列

解法一:暴力–錯誤

  • 複雜度O(k^2^ * N)
    類似兩個連結串列的合併,第一個節點全部對比,小的取出,指標後移,再比較。。。。

解法二:暴力

  • 遍歷k個連結串列,將節點全部新增至集合,對集合排序。

解法三:分治–歸併排序

複雜度O(kNlogN)

  • 兩個連結串列排序
  • 四個連結串列
  • 8個。。
  • 。。。
/**
 * Definition for singly-linked list.
 * public
class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode mergeKLists(ListNode[] lists) { int len = lists.length; if (len == 0) { return null; } return mergerSort(lists, 0, len - 1
); } private ListNode mergerSort(ListNode[] lists, int left, int right) { if (left == right) { return lists[left]; } else if (left < right) { int mid = left + (right - left) / 2; ListNode first = mergerSort(lists, left, mid); ListNode second
= mergerSort(lists, mid + 1, right); return mergeTwoLists(first, second); } return null; } private ListNode mergeTwoLists(ListNode a, ListNode b) { ListNode node = new ListNode(0); ListNode copy = node; while (a != null && b != null) { if(a.val <= b.val){ node.next = a; a = a.next; } else { node.next = b; b = b.next; } node = node.next; } if (a != null) { node.next = a; } else if(b != null){ node.next = b; } return copy.next; } }