LeetCode題練習與總結:排序鏈表--148

一、題目描述

給你鏈表的頭結點?head?,請將其按?升序?排列并返回?排序后的鏈表?。

示例 1:

輸入:head = [4,2,1,3]
輸出:[1,2,3,4]

示例 2:

輸入:head = [-1,5,3,4,0]
輸出:[-1,0,3,4,5]

示例 3:

輸入:head = []
輸出:[]

提示:

  • 鏈表中節點的數目在范圍?[0, 5 * 10^4]?內
  • -10^5?<= Node.val <= 10^5

二、解題思路

要解決這個問題,我們可以使用歸并排序,這是一種適合鏈表的排序算法,因為鏈表的元素在內存中不是連續存儲的,歸并排序不需要額外的存儲空間,且時間復雜度為O(n log n),是一種效率較高的排序算法。

歸并排序的基本思想是將鏈表分成兩半,分別對這兩半進行排序,然后將排序好的兩部分合并在一起。在鏈表中實現這一思想相對簡單,因為只需要改變節點的next指針即可完成排序。

以下是使用歸并排序對鏈表進行排序的步驟:

  1. 找到鏈表的中點,可以使用快慢指針法。
  2. 將鏈表從中點斷開,形成兩個子鏈表。
  3. 對兩個子鏈表分別進行遞歸排序。
  4. 將兩個已排序的子鏈表合并在一起。

三、具體代碼

class Solution {public ListNode sortList(ListNode head) {if (head == null || head.next == null) {return head;}// Step 1. 分割鏈表ListNode slow = head, fast = head.next;while (fast != null && fast.next != null) {slow = slow.next;fast = fast.next.next;}ListNode mid = slow.next;slow.next = null;// Step 2. 遞歸排序ListNode left = sortList(head);ListNode right = sortList(mid);// Step 3. 合并鏈表return merge(left, right);}private ListNode merge(ListNode l1, ListNode l2) {ListNode dummy = new ListNode(0);ListNode current = dummy;while (l1 != null && l2 != null) {if (l1.val < l2.val) {current.next = l1;l1 = l1.next;} else {current.next = l2;l2 = l2.next;}current = current.next;}if (l1 != null) {current.next = l1;} else {current.next = l2;}return dummy.next;}
}

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

1. 時間復雜度
  • 分割鏈表:使用快慢指針找到中點的時間復雜度是O(n),其中n是鏈表的長度。
  • 遞歸排序:將鏈表分割成兩半,每半的長度大約是n/2,因此遞歸的深度是O(log n),每次遞歸調用需要對兩個子鏈表進行合并,合并的時間復雜度是O(n),所以遞歸排序的總時間復雜度是O(n log n)。
  • 合并鏈表:合并兩個有序鏈表的時間復雜度是O(n),因為每個節點最多被訪問一次。
  • 綜上所述,整個算法的時間復雜度是O(n log n)。
2. 空間復雜度
  • 遞歸棧空間:由于歸并排序是遞歸進行的,所以需要遞歸棧空間。遞歸的最大深度是O(log n),每個遞歸調用需要常數空間,所以遞歸棧空間的總空間復雜度是O(log n)。
  • 合并鏈表:合并鏈表時,除了輸入的鏈表節點外,只需要一個啞節點和幾個指針,不需要額外的空間,因此合并鏈表的空間復雜度是O(1)。
  • 綜上所述,整個算法的空間復雜度是O(log n),主要取決于遞歸棧的空間消耗。

綜合以上分析,歸并排序鏈表的算法時間復雜度是O(n log n),空間復雜度是O(log n)。

五、總結知識點

1. 鏈表的基本操作:

  • 節點構成:鏈表由節點組成,每個節點包含數據和指向下一個節點的引用。
  • 創建與遍歷:鏈表的創建通過連接節點實現,遍歷則是通過依次訪問節點的引用。
  • 分割與合并:鏈表的分割通過調整節點的引用實現,合并則是將兩個鏈表的節點按特定順序連接。

2. 遞歸:

  • 函數自調用:遞歸允許函數調用自身,用于解決可以分解為更小相似問題的大問題。
  • 分治策略:在歸并排序中,遞歸用于將鏈表分成更小的部分,分別排序后再合并。

3. 快慢指針:

  • 中點查找:快慢指針技術用于找到鏈表的中點,快指針每次移動兩步,慢指針移動一步。
  • 鏈表分割:當快指針到達鏈表末尾時,慢指針所指即為鏈表的中點,從而實現鏈表的分割。

4. 歸并排序:

  • 分治算法:歸并排序是一種分治算法,將數據分為兩半,分別排序后再合并。
  • 時間復雜度:歸并排序的時間復雜度為O(n log n),適用于鏈表排序。

5. 合并有序鏈表:

  • 比較與連接:合并兩個有序鏈表時,比較節點值,將較小的節點連接到結果鏈表中。
  • 鏈表拼接:當一個鏈表為空時,將另一個鏈表的剩余部分接到結果鏈表的末尾。

6. 啞節點:

  • 輔助節點:啞節點作為輔助節點,用于簡化鏈表操作的邊界條件處理。
  • 處理頭節點:在合并鏈表時,使用啞節點作為結果鏈表的起始節點,避免處理頭節點的特殊情況。

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

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

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

相關文章

封鎖-封鎖模式(共享鎖、排他鎖)、封鎖協議(兩階段封鎖協議)

一、引言 1、封鎖技術是目前大多數商用DBMS采用的并發控制技術&#xff0c;封鎖技術通過在數據庫對象上維護鎖來實現并發事務非串行調度的沖突可串行化 2、基于鎖的并發控制的基本思想是&#xff1a; 當一個事務對需要訪問的數據庫對象&#xff0c;例如關系、元組等進行操作…

【嵌入式開發 Linux 常用命令系列 1.6 -- grep 過濾指定的目錄】

請閱讀【嵌入式開發學習必備專欄 】 文章目錄 grep 過濾指定目錄 grep 過濾指定目錄 在Linux中使用grep搜索字符串并希望排除特定目錄時&#xff0c;可以使用--exclude-dir參數。這個參數允許你指定一個或多個目錄名稱來排除它們的內容不被grep搜索。這對于忽略一些常見的臨時…

LLM - 詞向量 Word2vec

1. 詞向量是一個詞的低維表示&#xff0c;詞向量可以反應語言的一些規律&#xff0c;詞意相近的詞向量之間近乎于平行。 2. 詞向量的實現&#xff1a; &#xff08;1&#xff09;首先使用滑動窗口來構造數據&#xff0c;一個滑動窗口是指在一段文本中連續出現的幾個單詞&#x…

llamaindex實戰-使用本地大模型和數據庫對話

概述 本文使用NLSQLTableQueryEngine 查詢引擎來構建SQL的自然語言處理查詢。 請注意&#xff0c;我們需要指定要與該查詢引擎一起使用的表。如果我們不這樣做&#xff0c;查詢引擎將提取所有架構上下文&#xff0c;這可能會溢出 LLM 的上下文窗口。 在以下情況都可以使用NL…

如何用Java寫一個整理Java方法調用關系網絡的程序

大家好&#xff0c;我是猿碼叔叔&#xff0c;一位 Java 語言工作者&#xff0c;也是一位算法學習剛入門的小學生。很久沒有為大家帶來干貨了。 最近遇到了一個問題&#xff0c;大致是這樣的&#xff1a;如果給你一個 java 方法&#xff0c;如何找到有哪些菜單在使用。我的第一想…

線程中如何有效避免死鎖問題

1. 理解死鎖形成的原因 互斥條件&#xff1a;一個資源每次只能被一個線程使用。 請求與保持條件&#xff1a;線程因請求資源而阻塞時&#xff0c;對已獲得的資源保持不放。 不剝奪條件&#xff1a;線程已獲得的資源&#xff0c;在末使用完之前&#xff0c;不能強行剝奪。 循環…

c++ primer plus 第15章友,異常和其他:15.1.3 其他友元關系

c primer plus 第15章友&#xff0c;異常和其他&#xff1a;15.1.3 其他友元關系 提示&#xff1a;這里可以添加系列文章的所有文章的目錄&#xff0c;目錄需要自己手動添加 15.1.3 其他友元關系 提示&#xff1a;寫完文章后&#xff0c;目錄可以自動生成&#xff0c;如何生成可…

整潔架構SOLID-單一職責原則(SRP)

文章目錄 定義案例分析重復的假象代碼合并解決方案 小結 定義 SRP是SOLID五大設計原則中最容易被誤解的一個。也許是名字的原因&#xff0c;很多程序員根據SRP這個名字想當然地認為這個原則就是指&#xff1a;每個模塊都應該只做一件事。 在歷史上&#xff0c;我們曾經這樣描…

科研繪圖系列:R語言雙側條形圖(bar Plot)

介紹 雙側條形圖上的每個條形代表一個特定的細菌屬,條形的高度表示該屬的LDA得分的對數值,顏色用來區分不同的分類群或組別,它具有以下優點: 可視化差異:條形圖可以直觀地展示不同細菌屬在得分上的差異。強調重要性:較高的條形表示某些特征在區分不同組別中具有重要作用…

# Sharding-JDBC從入門到精通(6)-- Sharding-JDBC 水平分庫 和 垂直分庫。

Sharding-JDBC從入門到精通&#xff08;6&#xff09;-- Sharding-JDBC 水平分庫 和 垂直分庫。 一、Sharding-JDBC 水平分庫-分片策略配置 1、分庫策略定義方式如下 # 分庫策略&#xff0c;如何將一個邏輯表映射到多個數據源 spring.shardingsphere.sharding.tables.<邏…

第33集《大乘起信論》

《大乘起信論》和尚尼慈悲&#xff0c;諸位法師、諸位居士&#xff0c;阿彌陀佛&#xff01;&#xff08;阿彌陀佛&#xff01;&#xff09;請大家打開《講義》第七十四頁&#xff0c;子二、釋觀。 本論的特色&#xff0c;一言以蔽之就是文簡意賅、辭約理富&#xff0c;就是說…

VUE2拖拽組件:vue-draggable-resizable-gorkys

vue-draggable-resizable-gorkys組件基于vue-draggable-resizable進行二次開發, 用于可調整大小和可拖動元素的組件并支持沖突檢測、元素吸附、元素對齊、輔助線 安裝: npm install --save vue-draggable-resizable-gorkys 全局引用: import Vue from vue import vdr fro…

嵌入式linux面試1

1. linux 1.1. Window系統和Linux系統的區別 linux區分大小寫windows在dos&#xff08;磁盤操作系統&#xff09;界面命令下不區分大小寫&#xff1b; 1.2. 文件格式區分 windows用擴展名區分文件&#xff1b;如.exe代表執行文件&#xff0c;.txt代表文本文件&#xff0c;.…

運用Python與Keras框架打造深度學習圖像分類應用:詳盡步驟與代碼實例解析

引言 隨著深度學習技術的飛速發展&#xff0c;其在圖像識別和分類領域的應用日益廣泛。在這一背景下&#xff0c;Python因其豐富的數據科學庫和強大的生態系統而成為首選編程語言之一。在本文中&#xff0c;我們將深入探討如何使用Python和其中的Keras深度學習框架來完成一個實…

手動將dingtalk-sdk-java jar包打入maven本地倉庫

有時候,中央鏡像庫不一定有自己需要的jar包,這時候我們就需要用到該方法,將jar打入maven本地倉庫,然后項目中,正常使用maven的引入規則。 mvn install:install-file -Dmaven.repo.local=D:\software\maven\apache-maven-3.6.3-bin\apache-maven-3.6.3\repo -DgroupId=ding…

學習筆記——交通安全分析11

目錄 前言 當天學習筆記整理 4信控交叉口交通安全分析 結束語 前言 #隨著上一輪SPSS學習完成之后&#xff0c;本人又開始了新教材《交通安全分析》的學習 #整理過程不易&#xff0c;喜歡UP就點個免費的關注趴 #本期內容接上一期10筆記 #最近確實太懶了&#xff0c;接受…

跨越數據邊界:域適應在目標檢測中的革新作用

標題&#xff1a;跨越數據邊界&#xff1a;域適應在目標檢測中的革新作用 在機器學習和計算機視覺領域&#xff0c;尤其是目標檢測任務中&#xff0c;域適應&#xff08;Domain Adaptation&#xff09;是一種關鍵技術&#xff0c;它解決了模型在不同數據分布上的泛化問題。當訓…

C語言字節對齊技術在嵌入式、網絡與操作系統中的應用與優化

第一部分&#xff1a;嵌入式系統中的字節對齊 嵌入式系統通常對性能和資源有著嚴格的要求。在這些系統中&#xff0c;字節對齊的正確使用可以顯著提高數據訪問速度&#xff0c;減少內存占用&#xff0c;并提高系統的整體效率。 一、嵌入式系統中的字節對齊挑戰 嵌入式系統中…

Caffeinated for Mac v2.0.6 Mac防休眠應用 兼容 M1/M2/M3

Caffeinated 可以防止您的 Mac 進入休眠狀態、屏幕變暗或者啟動屏幕保護。 應用介紹 您的屏幕是否總是在您不希望的時候變暗&#xff1f;那么Caffeinated就是您解決這個大麻煩的最好工具啦。Caffeinated是在Caffeine這個非常便捷、有用的工具的基礎上開發而來的。Caffeinated…

215. 數組中的第K個最大元素(中等)

215. 數組中的第K個最大元素 1. 題目描述2.詳細題解3.代碼實現3.1 Python3.2 Java 1. 題目描述 題目中轉&#xff1a;215. 數組中的第K個最大元素 2.詳細題解 快速排序算法在每一輪排序中&#xff0c;隨機選擇一個數字 x x x&#xff0c;根據與 x x x的大小關系將要排序的數…