LeetCode題練習與總結:合并K個升序鏈表

一、題目

給你一個鏈表數組,每個鏈表都已經按升序排列。

請你將所有鏈表合并到一個升序鏈表中,返回合并后的鏈表。

二、解題思路

  1. 創建一個最小堆(優先隊列)來存儲所有鏈表的頭節點。這樣我們可以始終取出當前所有鏈表中值最小的節點。
  2. 初始化一個虛擬頭節點(dummy),它將作為合并后鏈表的頭節點。
  3. 創建一個指針(current)指向虛擬頭節點,用于構建新的鏈表。
  4. 循環執行以下步驟直到所有鏈表都被合并: a. 從最小堆中取出最小節點。 b. 將current指針移動到這個最小節點。 c. 將最小節點的next指針指向最小堆中的下一個最小節點,或者如果當前鏈表已經沒有更多節點,則指向null。 d. 將取出的節點的原鏈表的下一個節點加入到最小堆中,以便后續處理。
  5. 當所有鏈表都合并完畢,current指針將指向合并后鏈表的尾節點。返回虛擬頭節點的下一個節點即為合并后的鏈表。

三、具體代碼

import java.util.PriorityQueue;class Solution {public ListNode mergeKLists(ListNode[] lists) {// 創建一個最小堆來存儲鏈表頭節點PriorityQueue<ListNode> minHeap = new PriorityQueue<>((a, b) -> a.val - b.val);// 初始化虛擬頭節點ListNode dummy = new ListNode(0);ListNode current = dummy;// 初始化最小堆for (ListNode list : lists) {if (list != null) {minHeap.offer(list);}}// 開始合并鏈表while (!minHeap.isEmpty()) {// 取出最小節點ListNode minNode = minHeap.poll();// 將current指向這個最小節點current.next = minNode;// 移動current指針current = current.next;// 如果還有下一個節點,加入到最小堆中if (minNode.next != null) {minHeap.offer(minNode.next);}}// 返回合并后的鏈表頭節點return dummy.next;}
}// ListNode的定義已經在問題描述中給出

四、時間復雜度和空間復雜度

1. 時間復雜度
  • 時間復雜度是O(NlogK)。

  • 初始化最小堆的時間復雜度是O(N),其中N是所有鏈表中元素的總數。這是因為我們需要遍歷每個鏈表的頭節點,并將它們加入到最小堆中。對于每個節點,最小堆的插入操作是O(logK),K是鏈表的數量。但是,由于每個節點最多被插入一次,所以這部分的總時間復雜度是O(N)。

  • 合并鏈表的循環中,我們從最小堆中取出節點,這個操作是O(logK)。然后,我們將取出的節點的下一個節點(如果有的話)再次加入到最小堆中,這個操作同樣是O(logK)。這個循環會執行N次,因為我們需要處理所有N個元素。所以,這部分的總時間復雜度是O(NlogK)。

2. 空間復雜度
  • 空間復雜度是O(K)。

  • 最小堆存儲了所有鏈表的頭節點,最多時有K個節點,所以空間復雜度是O(K)。

  • 合并后的鏈表不需要額外的空間,因為它是直接在原有鏈表的基礎上構建的。

  • 虛擬頭節點dummy是一個常數級別的空間開銷。

請注意,這里的K是鏈表的數量,而不是鏈表的長度。在實際應用中,如果鏈表數量遠小于鏈表長度,那么K可能會比N小得多,這樣時間復雜度和空間復雜度都會相對較低。

五、總結知識點

  1. 鏈表(Linked List):代碼中使用了單向鏈表的數據結構,每個ListNode包含一個值(val)和一個指向下一個節點的指針(next)。

  2. 優先隊列(PriorityQueue):為了有效地合并多個已排序的鏈表,代碼使用了Java的PriorityQueue,它是一個基于優先級堆(通常是最小堆)的無界隊列。在這個場景中,它被用來存儲所有鏈表的頭節點,以便快速取出當前最小的節點。

  3. 比較器(Comparator):在創建PriorityQueue時,使用了自定義的比較器來定義節點之間的排序規則。這里通過比較節點的值(val)來實現升序排列。

  4. 虛擬頭節點(Dummy Node):為了避免在合并鏈表時處理特殊情況(如空鏈表),代碼中創建了一個虛擬頭節點dummy。這樣可以簡化代碼邏輯,因為始終有一個有效的current節點可以連接新的節點。

  5. 循環和條件判斷:在合并鏈表的循環中,使用了while循環和if條件判斷來控制流程,確保在每次迭代中都取出最小節點,并將其正確地連接到合并后的鏈表中。

  6. 指針操作:在鏈表操作中,current指針被用來遍歷和構建新的鏈表。每次循環中,current都會移動到新添加的節點,以便為下一個節點的添加做準備。

  7. 返回值:最終,函數返回虛擬頭節點的下一個節點,即合并后鏈表的實際頭節點。這是鏈表操作中常見的技巧,用于簡化邊界條件的處理。

以上就是解決這個問題的詳細步驟,希望能夠為各位提供啟發和幫助。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/715916.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/715916.shtml
英文地址,請注明出處:http://en.pswp.cn/news/715916.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

人工智能指數報告2023

人工智能指數報告2023 主要要點第 1 章 研究與開發第 2 章 技術性能第 3 章 人工智能技術倫理第 4 章 經濟第 5 章 教育第 6 章 政策與治理第 7 章 多樣性第 8 章 輿論 人工智能指數是斯坦福大學以人為本的人工智能研究所&#xff08;HAI&#xff09;的一項獨立倡議&#xff0c…

Java 石頭剪刀布小游戲

一、任務 編寫一個剪刀石頭布游戲的程序。程序啟動后會隨機生成1~3的隨機數&#xff0c;分別代表剪刀、石頭和布&#xff0c;玩家通過鍵盤輸入剪刀、石頭和布與電腦進行5輪的游戲&#xff0c;贏的次數多的一方為贏家。若五局皆為平局&#xff0c;則最終結果判為平局。 二、實…

redis 為什么會阻塞

目錄 前言 客戶端交換時的阻塞 redis 磁盤交換的阻塞 主從節點交互的阻塞 切片集群交互時的阻塞 異步執行的演變 redis 異步執行如何實現的 前言 大家對redis 比較熟悉吧&#xff0c;只要做項目都會用到redis&#xff0c;提高系統的吞吐。小米商城搶購高峰18k的qps&…

KubeSphere平臺安裝系列之三【Linux多節點部署KubeSphere】(3/3)

**《KubeSphere平臺安裝系列》** 【Kubernetes上安裝KubeSphere&#xff08;親測–實操完整版&#xff09;】&#xff08;1/3&#xff09; 【Linux單節點部署KubeSphere】&#xff08;2/3&#xff09; 【Linux多節點部署KubeSphere】&#xff08;3/3&#xff09; **《KubeS…

一句話講清楚數據庫中事務的隔離級別(通俗易懂版)

為什么我只說通俗易懂版不說嚴謹版? 因為嚴謹版遍地都是, 但是他們卻有一個缺點就是讓人看得云里霧里, 所以這就是我寫通俗易懂版的初衷! 但是既然是通俗易懂版就必然有缺陷, 只為了各位在開發過程中頭腦更加清晰, 如有錯誤還望兄弟們不吝賜教! 在MySQL數據庫中,事務一共有4…

C語言之strcmp函數,strlen函數

strcmp函數是比較兩個字符串ASCII大小的函數。 比較方式是自左向右比較&#xff0c;直到出現不同字符或者\0為止 語法格式 strcmp(字符串1,字符串2&#xff09; 如果兩個字符串相同&#xff0c;會返回數值0 如果字符串1>字符串2,會返回一個正數 如果字符串1<字符串2…

新一代電話機器人開源PHP源代碼

使用easyswoole 框架開發的 新一代電話機器人開源PHP源碼 項目地址&#xff1a;https://gitee.com/ddrjcode/robotphp 代理商頁面演示地址 http://119.23.229.15:8080 用戶名&#xff1a;c0508 密碼&#xff1a;123456 包含 AI外呼管理&#xff0c;話術管理&#xff0c;CR…

每日一題 — 復寫零

1089. 復寫零 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 首先找到最后一個復寫的數&#xff1a; 雙指針算法&#xff1a; 1、先判斷 cur 位置上的值 2、然后決定 dest 移動一步還是兩步 3、然后判斷 dest 是否到終點了 4、最后 cur 處理越界的情況 arr[n-1] …

使用sourceCompatibility = 11不匹配解決方法

運行springbootgradle項目報錯。 原因&#xff1a;在生產該項目時&#xff0c;選擇的JDK是11版本的&#xff0c;但是本地電腦只安裝了1.8版本。不兼容所以報錯。 解決辦法&#xff1a; 找到build.gradle配置文件—>找到sourceCompatibility ‘11’—>把11改成自己本地…

思維題(藍橋杯 填空題 C++)

目錄 題目一&#xff1a; ?編輯 代碼&#xff1a; 題目二&#xff1a; 代碼&#xff1a; 題目三&#xff1a; 代碼&#xff1a; 題目四&#xff1a; 代碼&#xff1a; 題目五&#xff1a; 代碼&#xff1a; 題目六&#xff1a; 代碼七&#xff1a; 題目八&#x…

用python和pygame庫實現刮刮樂游戲

用python和pygame庫實現刮刮樂游戲 首先&#xff0c;確保你已經安裝了pygame庫。如果沒有安裝&#xff0c;可以通過以下命令安裝&#xff1a; pip install pygame 示例有兩個。 一、簡單刮刮樂游戲 準備兩張圖片&#xff0c;一張作為背景bottom_image.png&#xff0c;一張作…

Leetcoder Day35| 動態規劃part02

62.不同路徑 一個機器人位于一個 m x n 網格的左上角 &#xff08;起始點在下圖中標記為 “Start” &#xff09;。 機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角&#xff08;在下圖中標記為 “Finish” &#xff09;。 問總共有多少條不同的路徑&#xff…

如何在Linux配置C、C++、Go語言的編譯環境?

在 Linux 系統上配置 C、C、Go 語言的編譯環境可以通過安裝相應的編譯器和相關工具來實現。以下是在 Linux 系統上配置這些語言的編譯環境的一般步驟&#xff1a; 1. C 和 C 編譯環境配置&#xff1a; 安裝 GCC 編譯器&#xff08;一般 Linux 發行版都會包含&#xff09;&…

Android 顯示系統框架

一.FrameBuffer FrameBuffer 介紹&#xff1a; FrameBuffer中文譯名為幀緩沖驅動&#xff0c;它是出現在2.2.xx內核中的一種驅動程序接口。主設備號為29&#xff0c;次設備號遞增。 Linux抽象出FrameBuffer這個設備來供用戶態進程實現直接寫屏。FrameBuffer機制模仿顯卡的功能…

Day11:信息打點-Web應用企業產權指紋識別域名資產網絡空間威脅情報

目錄 Web信息收集工具 業務資產-應用類型分類 Web單域名獲取-接口查詢 Web子域名獲取-解析枚舉 Web架構資產-平臺指紋識別 思維導圖 章節知識點&#xff1a; Web&#xff1a;語言/CMS/中間件/數據庫/系統/WAF等 系統&#xff1a;操作系統/端口服務/網絡環境/防火墻等 應用…

dart中的事件隊列與微任務

dart在每個事件循環中&#xff0c;會先執行同步任務代碼&#xff0c;然后分別檢查兩個任務隊列&#xff1a;微任務隊列和事件隊列。dart總是先執行微任務隊列中的代碼&#xff0c;然后才是事件隊列中的代碼。當兩個隊列中的任務都執行完成后&#xff0c;線程進入休眠狀態&#…

Stable Diffusion WebUI API http://127.0.0.1:7860/docs空白

在嘗試調用Stable Diffusion WebUI API的時候&#xff0c;打開http://127.0.0.1:7860/docs遇到了以下頁面 網絡診斷是這樣的原因&#xff1a; 修bug&#xff0c;改來改去遇到了以下兩種頁面&#xff1a; 此時http://127.0.0.1:7860可以如下正常顯示&#xff1a; 查資料的時候找…

vue+springboot項目部署服務器

項目倉庫&#xff1a;vuespringboot-demo: vuespringboot增刪改查的demo (gitee.com) ①vue中修改配置 在public文件夾下新建config.json文件&#xff1a; {"serverUrl": "http://localhost:9090"//這里localhost在打包后記得修改為服務器公網ip } 然后…

[NSSCTF 2nd] web復現

1.php簽到 <?phpfunction waf($filename){$black_list array("ph", "htaccess", "ini");$ext pathinfo($filename, PATHINFO_EXTENSION);foreach ($black_list as $value) {if (stristr($ext, $value)){return false;}}return true; }if(i…

nginx 配置瀏覽器不緩存文件 每次都會從服務器 請求新的文件

目錄 解決問題方法說明 測試html環境js環境第一步然后修改內容 打開帶有js緩存的頁面強制刷新 配置nginx 每次打開頁面都會重新請求index.js 文件重啟nginx再次修改index.js 總結設置為全局 解決問題 適用于實時更新數據的&#xff0c;網頁 可以讓用戶每次都是重新請求&#x…