LeetCode23 合併k個排序鏈表

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;
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章