1. 程式人生 > 其它 >java優先佇列,以及如何自定義優先佇列的插入順序-演算法題-筆試考過

java優先佇列,以及如何自定義優先佇列的插入順序-演算法題-筆試考過

思路:我們需要維護當前每個連結串列沒有被合併的元素的最前面一個,kk 個連結串列就最多有 kk 個滿足這樣條件的元素,每次在這些元素裡面選取 val 屬性最小的元素合併到答案中。在選取最小元素的時候,我們可以用優先佇列來優化這個過程。

作者:LeetCode-Solution
連結:https://leetcode-cn.com/problems/merge-k-sorted-lists/solution/he-bing-kge-pai-xu-lian-biao-by-leetcode-solutio-2/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

程式碼:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    class Status implements
Comparable<Status> { // 某個節點的數值與指標 int val; ListNode ptr; // 建構函式 public Status(int val, ListNode ptr) { this.val = val; this.ptr = ptr; } // 在優先佇列裡面,以升序排列 public int compareTo(Status status2) { return
this.val - status2.val; } } public ListNode mergeKLists(ListNode[] lists) { // 建立優先佇列 PriorityQueue<Status> queue = new PriorityQueue<>(); ListNode pre = new ListNode(0); ListNode preHead = pre; // 我們需要維護當前每個連結串列沒有被合併的元素的最前面一個,k 個連結串列就最多有 k 個滿足這樣條件的元素,每次在這些元素裡面選取 val 屬性最小的元素合併到答案中。在選取最小元素的時候,我們可以用優先佇列來優化這個過程。 for (ListNode node : lists) { if (node != null) { queue.offer(new Status(node.val, node)); } } while (!queue.isEmpty()) { // 取出優先佇列的頭元素,也就是最小元素 Status cur = queue.poll(); // 連線到pre節點上 pre.next = cur.ptr; pre = pre.next; // 把這個最小元素的next加入優先佇列 if (cur.ptr.next != null) { queue.offer(new Status(cur.ptr.next.val, cur.ptr.next)); } } return preHead.next; } }