1.描述
合併 k 個排序鏈表,返回合併後的排序鏈表。請分析和描述算法的複雜度。
示例:
輸入:
[
1->4->5,
1->3->4,
2->6
]
輸出: 1->1->2->3->4->4->5->6
2.思路:
- 比較 k 個節點(每個鏈表的首節點),獲得最小值的節點,並將選中的節點接在最終有序鏈表的後面。
- 其中在比較環節使用優先隊列進行優化
- 參考官方題解三,由於官方題解三給出的是Python語言解答,下面給出Java的代碼,其中需要自定義類和自定義比較器
3代碼:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
//自定義數據類型
public class ElementType {
int val;
ListNode node;
ElementType(int val,ListNode node){
this.val=val;
this.node=node;
}
}
class Solution {
//自定義比較器
static Comparator<ElementType> cNode=new Comparator<ElementType>() {
public int compare(ElementType a, ElementType b) {
return a.val-b.val;
}
};
public ListNode mergeKLists(ListNode[] lists) {
ListNode head=new ListNode(0);
ListNode point=head;
Queue<ElementType> queue=new PriorityQueue<ElementType>(cNode);
for(int i=0;i<lists.length;i++){
if(lists[i]==null) continue;
ElementType num=new ElementType(lists[i].val,lists[i]);
queue.add(num);
}
while(!queue.isEmpty()){
ElementType temp=queue.poll();
point.next=new ListNode(temp.val);
point=point.next;
temp.node=temp.node.next;
if(temp.node!=null)
queue.add(new ElementType(temp.node.val,temp.node));
}
return head.next;
}
}