中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java如何實現合并多個升序鏈表

發布時間:2023-04-17 17:17:49 來源:億速云 閱讀:124 作者:iii 欄目:開發技術

本篇內容介紹了“Java如何實現合并多個升序鏈表”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

需求描述

給出K個升序鏈接,要求把這K個升序鏈表合并成一個,并且這個鏈表也是升序的。

例如:A = [1,5,6]B = [2,3,8], C = [4,4,9] 將這3個鏈表合并成一個鏈表D,合并后D = [1,2,3,4,4,5,6,8,9],并且將D的第一個節點返回。

思路解析

我們可以采用優先級隊列來實現,先把每個鏈表的頭結點放到一個優先級隊列里,優先級隊列也叫小根堆。

在放小根堆的時候,誰小就把誰放在最上面。需要注意的是,我們放入的時候,放入的是節點,所以通過這個節點是可以訪問整個鏈表的。

我們看下處理過程:

  • 首先把每個鏈接的頭結點放入小根堆中:1,2,4

  • 首先彈出最小的值:1

  • 1節點的下一個節點5放入小根堆中,此時小根堆會自動調整順序,此時為:2, 4, 5

  • 2節點彈出,讓1節點的next指針指向2節點,并且將2節點的下一個節點6放入小根堆,此時已彈出的節點為 1,2,而小根堆為4, 5, 6

  • 4節點彈出,讓2節點的next指針指向4節點,并且將4節點的下一個節點4放入小根堆中,此時已彈出的節點為1,2,4,而小根堆為4, 5, 6

  • 依此類推,每彈出一個節點,拼接在已彈出節點的后面,并將彈出節點的下一個節點放入小根堆中,直到小根堆中所有的元素全部彈出。

好了,現在整體思路有了,但是現在是不是有個疑問?我們在做算法時,使用到了優先隊列,那么我們可以使用系統自帶的優先隊列嗎?

個人感覺,如果是面試時,這個系統自帶的類只是題目中很小的一部分,比如上面的題目,主要考察的是如何實現這個過程,而不是考察如何實現優先隊列的,如果沒有特殊要求不讓使用的話,是可以使用的。當然,如果考察是要實現一個優先隊列,我要是直接new一個PriorityQueue,我估計面試官會一巴掌把我拍出來。

代碼實現

鏈表節點定義如下:

public class ListNode {
   public int val;
   public ListNode next;
}

因為是小根堆,需要一個排序算法,所以定義一個比較器如下:

public class ListNodeComparator implements Comparator<ListNode> {
   @Override
   public int compare(ListNode o1, ListNode o2) {
      return o1.val - o2.val; 
   }
}

合并鏈接:

public ListNode mergeKLists(ListNode[] lists) {
   if (lists == null) {
      return null;
   }
   PriorityQueue<ListNode> heap = new PriorityQueue<>(new ListNodeComparator());
   for (int i = 0; i < lists.length; i++) {
      if (lists[i] != null) {
         heap.add(lists[i]);
      }
   }
   if (heap.isEmpty()) {
      return null;
   }
   ListNode head = heap.poll();
   ListNode pre = head;
   if (pre.next != null) {
      heap.add(pre.next);
   }
   while (!heap.isEmpty()) {
      ListNode cur = heap.poll();
      pre.next = cur;
      pre = cur;
      if (cur.next != null) {
         heap.add(cur.next);
      }
   }
   return head;
}

這個方法參數lists代表要傳進來多少個鏈表,方法合并多個鏈表后,返回鏈表的第一個節點。

時間復雜度

假設有M個鏈表,M個鏈表的總節點個數為N。此時,對于小根堆來說,他的規模大小為M,則對于小根堆來說他的操作時間復雜度為O(logM),一共有N個節點,所以時間復雜度為O(N*logM)

“Java如何實現合并多個升序鏈表”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

肇东市| 陆丰市| 潼南县| 磴口县| 郯城县| 金门县| 肃宁县| 库车县| 广元市| 宁都县| 疏附县| 海安县| 永春县| 沂源县| 涟源市| 科技| 南召县| 岳普湖县| 江都市| 沁阳市| 米泉市| 镇巴县| 施甸县| 高阳县| 迁西县| 陈巴尔虎旗| 刚察县| 桓仁| 自贡市| 新津县| 平遥县| 滦南县| 托克逊县| 湄潭县| 塘沽区| 墨玉县| 景洪市| 乌拉特中旗| 定安县| 阜阳市| 左贡县|