LeetCode23. 合併K個升序連結串列
阿新 • • 發佈:2020-12-20
方法1:使用優先佇列合併
方法2:分治法,兩兩合併
程式碼1:優先佇列
class Solution { public ListNode mergeKLists(ListNode[] lists) { /** * 方法1:使用優先佇列 * 把連結串列的頭結點都放進去,然後出隊當前優先佇列中最小的,接上鍊表,, * 然後讓出隊的那個節點的下一個入隊,再出隊當前優先佇列中最小的,直到優先佇列為空。 * 注意:優先佇列中不能出現 null,要對 null 進行判斷*/ if (lists == null || lists.length == 0) return null; ListNode dummyHead = new ListNode(-1); ListNode cur = dummyHead; PriorityQueue<ListNode> minHeap = new PriorityQueue<>((o1, o2) -> o1.val - o2.val); for (ListNode head : lists) {if (head != null) { // 注意 minHeap.add(head); } } while (!minHeap.isEmpty()) { ListNode temp = minHeap.poll(); if (temp.next != null) { // 注意,如果某個連結串列遍歷完了 minHeap.add(temp.next); } cur.next = temp; cur= cur.next; } return dummyHead.next; } }
程式碼2:分治法
M