本題是本人字節跳動一面考的算法題
原題是有序數組,一時沒想到怎么解決數組的問題,但是如果給的是有序鏈表數組,則可以用下面的方法解決
可以利用最小堆完成,時間復雜度是O(nklogk),具體過程如下:
創建一個大小為k的最小堆,堆中元素為k個鏈表中的每個鏈表的第一個元素
重復下列步驟
每次從堆中取出最小元素(堆頂元素),並將其存入輸出數組中
用堆頂元素所在鏈表元素的下一元素將堆頂元素替換掉,
初始化最小堆的時間復雜度O(k),總共有kn次循環,每次循環調整最小堆的時間復雜度是O(logk)
,所以總的時間復雜度是O(knlogk)
import java.util.ArrayList; import java.util.Comparator; import java.util.PriorityQueue; public class 合並K個有序數組 { public static ListNode merge(ListNode[] arr) { int k = arr.length; ListNode dumy = new ListNode(-1); ListNode p = dumy; PriorityQueue<ListNode> maxHeap = new PriorityQueue<>(k, new Comparator<ListNode>() { @Override public int compare(ListNode o1, ListNode o2) { return o1.val - o2.val; } }); for (int i = 0; i < k; i++) maxHeap.offer(arr[i]); while (!maxHeap.isEmpty()) { ListNode tmp = maxHeap.poll(); if (tmp.next != null) maxHeap.offer(tmp.next); p.next = tmp; p = p.next; } return dumy.next; } //測試代碼 public static void main(String[] args) { ListNode a1 = new ListNode(1); a1.next = new ListNode(2); a1.next.next = new ListNode(3); a1.next.next.next = new ListNode(100); ListNode b1 = new ListNode(1); b1.next = new ListNode(2); b1.next.next = new ListNode(3); ListNode c1 = new ListNode(2); c1.next = new ListNode(3); c1.next.next = new ListNode(5); ListNode[] arr = {a1, b1, c1}; ListNode res = merge(arr); while (res!= null) { System.out.print(res.val + " "); res = res.next; } } }