23. 合并 K 個升序鏈表 - 力扣(LeetCode)

基礎知識要求:

Java:方法、while循環、for循環、PriorityQueue類、if判斷

Python:?方法、while循環、for循環、heapq 模塊、if判斷

數據結構:隊列?

題目:?

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

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

示例 1:

輸入: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

示例 2:

輸入:lists = []
輸出:[]

示例 3:

輸入:lists = [[]]
輸出:[]

提示:

  • k == lists.length
  • 0 <= k <= 10^4
  • 0 <= lists[i].length <= 500
  • -10^4 <= lists[i][j] <= 10^4
  • lists[i]?按?升序?排列
  • lists[i].length?的總和不超過?10^4

思路解析:

對于合并多個已排序的列表或鏈表,一種常見的算法是使用最小堆(Min Heap)。在這個問題中,我們可以利用Python的heapq模塊來實現最小堆。

Python的heapq模塊不了解的,可以看一下我的這篇文章?Python 中的 heapq 模塊簡介

  1. 初始化:
    • 創建一個虛擬頭節點dummy,它的作用是簡化鏈表的操作,因為我們可以直接操作dummy.next來構建結果鏈表,而不需要擔心頭節點為空的情況。
    • 創建一個指針p,指向dummy,它將用于遍歷并構建結果鏈表。
    • 創建一個空的最小堆heap,用于存儲待合并鏈表中的節點和它們的值。
  2. 構建最小堆:
    • 遍歷所有輸入的鏈表lists
    • 對于每個鏈表,如果鏈表不為空,將其頭節點的值和節點本身作為一個元組(val, node)加入最小堆中。這里,我們利用節點的值val作為堆排序的優先級。
  3. 合并鏈表:
    • 當最小堆不為空時,執行以下步驟:
      • 從堆中彈出具有最小值的節點,即當前所有鏈表中的最小節點。
      • 將這個節點添加到結果鏈表中,即設置p.next = node,并移動指針p到下一個位置。
      • 如果彈出的節點有下一個節點(即node.next不為空),將這個節點的下一個節點和它的值作為一個新的元組(node.next.val, node.next)加入最小堆中。
  4. 返回結果:
    • 返回虛擬頭節點的下一個節點dummy.next,這就是合并后的排序鏈表的頭節點。

Java代碼示例:

import java.util.PriorityQueue;  class ListNode {  int val;  ListNode next;  ListNode(int x) { val = x; }  
}  public class Solution {  public ListNode mergeKLists(ListNode[] lists) {  // 創建一個虛擬頭節點  ListNode dummy = new ListNode(0);  ListNode p = dummy;  // 創建一個優先隊列,按照節點的值排序  PriorityQueue<ListNode> pq = new PriorityQueue<>((a, b) -> a.val - b.val);  // 將所有鏈表的頭節點加入優先隊列  for (ListNode head : lists) {  if (head != null) {  pq.offer(head);  }  }  // 從優先隊列中取出最小節點,直到隊列為空  while (!pq.isEmpty()) {  ListNode node = pq.poll();  p.next = node;  p = p.next;  // 如果當前節點的下一個節點不為空,則加入優先隊列  if (node.next != null) {  pq.offer(node.next);  }  }  // 返回結果鏈表的頭節點(虛擬頭節點的下一個節點)  return dummy.next;  }  
}

Python代碼示例:

import heapq  class ListNode:  def __init__(self, val=0, next=None):  self.val = val  # 節點的值  self.next = next  # 指向下一個節點的指針  def mergeKLists(lists):  # 創建一個虛擬頭節點,這樣可以避免處理頭節點為空的情況  dummy = ListNode(0)    p = dummy  # p用于遍歷合并后的鏈表  # 創建一個最小堆,用于存儲(節點值, 節點)對,這樣我們可以根據節點值來排序  heap = []    # 遍歷所有輸入的鏈表,將非空鏈表的頭節點加入最小堆  for lst in lists:    if lst:  # 如果鏈表不為空  heapq.heappush(heap, (lst.val, lst))  # 將節點的值和節點作為一個元組加入堆  # 當堆不為空時,繼續合并鏈表  while heap:  # 彈出堆頂元素(即當前所有節點中的最小值節點)  val, node = heapq.heappop(heap)    # 將該節點連接到結果鏈表的末尾  p.next = node    p = p.next  # 移動指針到下一個位置  # 如果當前節點的下一個節點不為空,將其加入最小堆  if node.next:    heapq.heappush(heap, (node.next.val, node.next))    # 返回合并后鏈表的頭節點(虛擬頭節點的下一個節點)  return dummy.next  # 示例:創建三個鏈表并合并它們  
lists = [  ListNode(1, ListNode(4, ListNode(5))),  # 鏈表1: 1->4->5  ListNode(1, ListNode(3, ListNode(4))),  # 鏈表2: 1->3->4  ListNode(2, ListNode(6))  # 鏈表3: 2->6  
]  # 調用mergeKLists函數合并鏈表  
merged_list = mergeKLists(lists)  # 打印合并后的鏈表  
current = merged_list  
while current:  print(current.val, end='->')  # 打印當前節點的值,并在末尾添加"->"  current = current.next  # 移動到下一個節點  
print('None')  # 表示鏈表結束

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

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

相關文章

11.php-fpm模板(監控頁面取值)

php-fpm模板(監控頁面取值) 開啟監控頁面配置 #修改php配置文件 vim /etc/php-fpm.d/www.conf pm.status_path /php_status#修改nginx配置文件,添加到nginx配置文件中 vim /etc/nginx/conf.d/default.conflocation /php_status {root html;fastcgi_pass 127.0.…

肥貓“也能變“型男“?揭秘福派斯牛肉高脂貓糧的神奇效果!

福貓養成指南&#xff1a;福派斯牛肉高脂貓糧的優點與考慮因素 福派斯牛肉高脂貓糧&#xff0c;這款富含蛋白質與脂肪的貓糧&#xff0c;仿佛是貓咪世界中的美味佳肴&#xff0c;讓無數貓咪為之傾倒。然而&#xff0c;這款貓糧的利與弊&#xff0c;你是否都了解呢&#xff1f;接…

AI模型部署實戰:利用OpenCV的CUDA模塊加速視覺模型部署流程

本文首發于公眾號【DeepDriving】&#xff0c;歡迎關注。 一. 前言 我在之前的文章《AI模型部署實戰&#xff1a;利用CV-CUDA加速視覺模型部署流程》中介紹了如何使用CV-CUDA庫來加速視覺模型部署的流程&#xff0c;但是CV-CUDA對系統版本和CUDA版本的要求比較高&#xff0c;在…

大模型介紹

大模型通常指的是參數量超過億級別&#xff0c;甚至千億級別的深度學習模型。這類模型能夠處理更加復雜的任務&#xff0c;并在各項基準測試中取得了優異的成績。大模型在自然語言處理、計算機視覺、推薦系統等領域都取得了顯著的成果。 大模型的主要優勢在于其強大的表征能力&…

k8s的核心組件etcd功能詳解【含etcd各類參數詳細說明】

etcd 是 Kubernetes 中的一個關鍵組件&#xff0c;用于存儲集群的配置信息、狀態和元數據。它通常作為 Kubernetes 集群的數據存儲后端&#xff0c;為其他組件提供可靠的分布式鍵值存儲服務。下面我會詳細介紹 etcd 的功能以及常見的參數&#xff0c;以及如何配置和使用 etcd。…

Linux實驗 Shell編程

實驗目的&#xff1a; 熟練掌握Shell程序的建立與執行&#xff1b;掌握Shell變量的兩種類型&#xff08;Shell環境變量和用戶自定義變量&#xff09;及其用法&#xff1b;掌握Shell中的特殊字符、算術與邏輯運算&#xff1b;掌握Shell中輸入輸出命令&#xff1b;掌握Shell程序…

在Windows環境下安裝CPU版的PyTorch

PytTorch是基于Python開發的&#xff0c;首先需要安裝Python&#xff0c;Python的安裝很簡單&#xff0c;這里不再贅述。而 Windows用戶能直接通過conda、pip和源碼編譯三種方式來安裝PyTorch。 打開PyTorch官網&#xff08;PyTorch&#xff09;&#xff0c;在主頁中根據自己的…

基于OpenCV年齡與性別識別系統

深入解析基于OpenCV年齡與性別識別系統 在這篇博客中&#xff0c;我們將詳細解析一個使用OpenCV進行年齡和性別識別的Python腳本。這個腳本展示了如何利用深度學習模型&#xff0c;從視頻或圖像中檢測人臉并預測每個人臉的年齡和性別。 1. 導入必要的模塊 import cv2 as cv …

ELK的詳解

ELK是由Elasticsearch、Logstash和Kibana三個開源軟件&#xff08;后來又新加了一個FileBeat&#xff09;組成的日志管理解決方案&#xff0c;這一組合在近年來得到了廣泛的關注和應用。以下是對這三個組件的詳細說明&#xff1a; Elasticsearch&#xff1a; Elasticsearch是…

nginx 負載均衡配置詳解

基于 ${nginx_home}/conf/nginx.conf 文件配置實現&#xff0c;如下&#xff1a; http {# 定義server地址upstream server_group {server 192.168.xxx.1:8080;server 192.168.xxx.2:8080;server 192.168.xxx.3:8080;}server {listen 80;location / {root html;index …

python數據分析——時間序列

時間序列 前言一、Datetime 模塊常用函數和數據結構的詳細解釋datetime模塊示例一示例二 二、時間運算示例一示例二示例三 三、時間序列分析自回歸(Autoregressive model/AR)模型示例 滑動平均(moving average model/MA)模型示例 自回歸滑動平均(Autoregressive moving average…

持續總結中!2024年面試必問 100 道 Java基礎面試題(四十五)

上一篇地址&#xff1a;持續總結中&#xff01;2024年面試必問 100 道 Java基礎面試題&#xff08;四十四&#xff09;-CSDN博客 八十九、在Java中&#xff0c;什么是線程局部變量&#xff08;ThreadLocal變量&#xff09;&#xff1f; 在Java中&#xff0c;ThreadLocal變量是…

企業微信hook接口協議,ipad協議http,發送鏈接的方式邀請成員進群

發送鏈接的方式邀請成員進群 參數名必選類型說明uuid是String每個實例的唯一標識&#xff0c;根據uuid操作具體企業微信 請求示例 {"uuid":"3240fde0-45e2-48c0-90e8-cb098d0ebe43","roomid":10696052955013729, "vids":[788130334…

Flutter 中的 CircleAvatar 小部件:全面指南

Flutter 中的 CircleAvatar 小部件&#xff1a;全面指南 在 Flutter 中&#xff0c;CircleAvatar 是一個用于顯示頭像的圓形控件&#xff0c;通常包含一個圖標、圖片或者一個簡單的文本字符。它在設計上與 Material Design 指南中的頭像規范相匹配&#xff0c;常用于展示用戶信…

C# 常用匯總

時間處理 public static class DateTimeHelper{/// <summary>/// 獲取當前時間戳&#xff08;Unix時間戳&#xff09; /// </summary>/// <returns></returns>public static long GetCurrentUnixTimestamp(){DateTimeOffset offset DateTimeOffset.…

Qt---文件系統

一、基本文件操作 1. QFile對文件進行讀和寫 QFile file( path 文件路徑) 讀&#xff1a; file.open(打開方式) QlODevice::readOnly 全部讀取->file.readAll()&#xff0c;按行讀->file.readLine()&#xff0c;atend()->判斷是否讀到文件尾 …

Java網絡編程基礎

Java網絡編程基礎主要涉及進程間通信、網絡通信協議、IP地址和端口以及Java提供的網絡應用編程接口等核心概念。 進程間通信是Java網絡編程的基礎。進程是運行中的程序&#xff0c;而進程間通信則是指不同進程之間進行數據交換和共享信息的過程。在Java中&#xff0c;進程間的…

STM32存儲左右互搏 USB接口FATS文件讀寫U盤

STM32存儲左右互搏 USB接口FATS文件讀寫U盤 STM32的USB接口可以例化為Host主機從而對U盤進行操作。SD卡/MicroSD/TF卡也可以通過讀卡器轉換成U盤使用。這里介紹STM32CUBEIDE開發平臺HAL庫實現U盤FATS文件訪問的例程。 USB接口介紹 常見的USB接口電路部分相似而有不同的連接器…

K8S -----二進制搭建 Kubernetes v1.20

目錄 一、準備環境 1.1 修改主機名 1.2 關閉防火墻&#xff08;三臺一起&#xff0c;這里只展示master01&#xff09; 1.3 在master添加hosts&#xff08;依舊是三臺一起&#xff09; 1.4 調整內核參數并開啟網橋模式 二、部署docker引擎 三、部署 etcd 集群 1.在mast…

15.JUC原子類

文章目錄 JUC原子類1.JUC中的Atomic原子操作包1.1. 基本原子類&#xff08;Basic Atomic Classes&#xff09;1.2. 數組原子類&#xff08;Array Atomic Classes&#xff09;1.3. 引用原子類&#xff08;Reference Atomic Classes&#xff09;4. 字段更新原子類&#xff08;Fie…