給定一個鏈表數組,每個鏈表都已經按升序排列。
請將所有鏈表合并到一個升序鏈表中,返回合并后的鏈表。
輸入:lists = [[1,4,5],[1,3,4],[2,6]] 輸出:[1,1,2,3,4,4,5,6] 解釋:鏈表數組如下: [1->4->5,1->3->4,2->6 ] 將它們合并到一個有序鏈表中得到。 1->1->2->3->4->4->5->6
? ? ? ?這道題看似困難題,其實還是比較容易好想的,我們可以維護一個優先最小隊列,然后聲明一個虛擬頭結點,每次出一個最小的節點掛載在已經掛載節點的后面,當隊列為空時,就說明我們K個升序列表已經合并完成
?
public ListNode mergeKLists(ListNode[] lists) {if(lists==null||lists.length==0){return null;}//自定義比較器PriorityQueue<ListNode> queue=new PriorityQueue<>(new Comparator<ListNode>() {@Overridepublic int compare(ListNode o1, ListNode o2) {return o1.val-o2.val;}});//將K個節點的頭結點入隊for(ListNode node:lists){if(node!=null){queue.offer(node);}}//創建一個虛擬頭結點ListNode dummyNode=new ListNode(-1);ListNode curNode=dummyNode;while(!queue.isEmpty()){ListNode cur=queue.poll();curNode.next=cur;//更新curNodecurNode=curNode.next;//如果當前節點的next不為空,則讓下一個節點進行入隊if(cur.next!=null){queue.offer(cur.next);}}return dummyNode.next;}