鏈表的面試題4之合并有序鏈表

?這篇文章我們繼續來講鏈表中很經典的面試題:合并有序鏈表。

目錄

迭代

遞歸


?我們首先來看一下這張圖片里面的要求,給你兩個鏈表,要求把他們按照從小到大的方式排列。

這里涉及到幾個問題,首先,我們的頭節點是不是要釋放一個?而且我們把該節點連接到另外一個鏈表的某個節點上的時候?會不會存在指針丟失的問題?就算你鏈接的很穩妥,那么這里又會涉及到時間復雜度和空間復雜度的問題。

好了,不多說了,再說就要被自己繞暈了哈哈,初學者就是不需要想很多,遇到鏈表的題,無非三種路徑,雙指針,迭代,遞歸。

我們先來看好理解的迭代的方法。當然這道題的雙指針和迭代其實也是殊途同歸。本質上是一樣的。

迭代

我們可以用迭代的方法來實現上述算法。當 l1 和 l2 都不是空鏈表時,判斷 l1 和 l2 哪一個鏈表的頭節點的值更小,將較小值的節點添加到結果里,當一個節點被添加到結果里之后,將對應鏈表中的節點向后移一位。

所以這其實是一種暴力求法,也就是說,我一個個拿出來比較,因為我的原鏈表是有序的,所以不存在重復比較的過程。所以我就大膽給兩個鏈表各一個變量去遍歷然后比較。

當然,這里為什么要自定義一個哨兵位頭節點?因為有了頭節點能夠更好更容易返回我們合并后的鏈表。這里把代碼給大家放一下,稍微填了一些注釋。

class Solution {
public:ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {auto dummy = new ListNode(0);auto cur = dummy;while( list1 && list2 ){auto pp = (list1->val < list2->val) ? &list1 : &list2;  // 獲取倆鏈表當前值小的結點cur->next = *pp;    // cur 指向值小的結點cur = cur->next;    // cur 后移*pp = (*pp)->next;  // *pp 也要后移,不然下次循環比較的還是舊的list1或list2結點}// 循環結束,list1 和 list2 其中有一個為空,但不知道是哪個cur->next = (list1) ? list1 : list2;return dummy->next;}
};

遞歸

我們再來看遞歸。遞歸其實難的不是想不想的到,難的是對自我返回條件的判定。簡單的說,難的是這個遞歸該做到哪一步。怎么回歸。當然,如果你做的多了,很快很自然就能想到我為什么需要去限制比較的條件呢,或者說我回歸的應該是節點,我的條件的判斷才應該是比較。
所以代碼如下:

public class Solution {public ListNode MergeTwoLists(ListNode l1, ListNode l2) {if (l1 == null) {return l2;} else if (l2 == null) {return l1;} else if (l1.val < l2.val) {l1.next = MergeTwoLists(l1.next, l2);return l1;} else {l2.next = MergeTwoLists(l1, l2.next);return l2;}}
}

好了,這道題就講到這里

如果你覺得對你有幫助,可以點贊關注加收藏,感謝您的閱讀,我們下一篇文章再見。

一步步來,總會學會的,首先要懂思路,才能有東西寫。

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

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

相關文章

flea-cache使用之Redis哨兵模式接入

Redis哨兵模式接入 1. 參考2. 依賴3. 基礎接入3.1 定義Flea緩存接口3.2 定義抽象Flea緩存類3.3 定義Redis客戶端接口類3.4 定義Redis客戶端命令行3.5 定義哨兵模式Redis客戶端實現類3.6 定義Redis哨兵連接池3.7 定義Redis哨兵配置文件3.8 定義Redis Flea緩存類3.9 定義抽象Flea…

OpenAI for Countries:全球AI基礎設施的“技術基建革命”

2025年5月7日&#xff0c;OpenAI宣布啟動“OpenAI for Countries”計劃&#xff0c;目標是為全球各國構建本土化的AI基礎設施&#xff0c;提供定制化服務。這一計劃被視為其“星際之門”項目的全球化延伸&#xff0c;以技術合作為核心&#xff0c;覆蓋數據中心建設、模型適配與…

Linux精確列出非法 UTF-8 字符的路徑或文件名

Docker構建的時候報錯:failed to solve: Internal: rpc error: code = Internal desc = grpc: error while marshaling: string field contains invalid UTF-8 1、創建一個test.sh文件 find . -print0 | while IFS= read -r -d file;

FFmpeg在Android開發中的核心價值是什么?

FFmpeg 在 Android 開發中的核心價值主要體現在其強大的多媒體處理能力和靈活性上&#xff0c;尤其在音視頻編解碼、流媒體處理及跨平臺兼容性方面具有不可替代的作用。以下是具體分析&#xff1a; --- 1. 強大的音視頻編解碼能力 - 支持廣泛格式&#xff1a;FFmpeg 支持幾乎所…

自我獎勵語言模型:突破人類反饋瓶頸

核心思想 自我獎勵語言模型提出了一種全新的語言模型對齊范式。傳統方法如RLHF或DPO依賴人類反饋數據訓練固定的獎勵模型&#xff0c;這使模型的能力受限于人類標注數據的質量和數量。論文作者認為&#xff0c;要實現超人類能力的AI代理&#xff0c;未來的模型需要突破人類反饋…

5. 動畫/過渡模塊 - 交互式儀表盤

5. 動畫/過渡模塊 - 交互式儀表盤 案例&#xff1a;數據分析儀表盤 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><style type"text/css">.dashboard {font-family: Arial…

【前端三劍客】Ajax技術實現前端開發

目錄 一、原生AJAX 1.1AJAX 簡介 1.2XML 簡介 1.3AJAX 的特點 1.3.1AJAX 的優點 1.3.2AJAX 的缺點 1.4AJAX 的使用 1.4.1核心對象 1.4.2使用步驟 1.4.3解決IE 緩存問題 1.4.4AJAX 請求狀態 二、jQuery 中的AJAX 2.1 get 請求 2.2 post 請求 三、跨域 3.1同源策略…

SQL 索引優化指南:原理、知識點與實踐案例

SQL 索引優化指南&#xff1a;原理、知識點與實踐案例 索引的基本原理 索引是數據庫中用于加速數據檢索的數據結構&#xff0c;類似于書籍的目錄。它通過創建額外的數據結構來存儲部分數據&#xff0c;使得查詢可以快速定位到所需數據而不必掃描整個表。 索引的工作原理 B-…

typedef unsigned short uint16_t; typedef unsigned int uint32_t;

你提到的這兩行是 C/C 中的類型別名定義&#xff1a; typedef unsigned short uint16_t; typedef unsigned int uint32_t;它們的目的是讓代碼更具可讀性和可移植性&#xff0c;尤其在處理精確位數的整數時非常有用。 ? 含義解釋 typedef unsigned short uint16_t;…

Hapi.js知識框架

一、Hapi.js 基礎 1. 核心概念 企業級Node.js框架&#xff1a;由Walmart團隊創建&#xff0c;現由社區維護 配置驅動&#xff1a;強調聲明式配置而非中間件 插件架構&#xff1a;高度模塊化設計 安全優先&#xff1a;內置安全最佳實踐 豐富的生態系統&#xff1a;官方維護…

【PostgreSQL數據分析實戰:從數據清洗到可視化全流程】金融風控分析案例-10.3 風險指標可視化監控

&#x1f449; 點擊關注不迷路 &#x1f449; 點擊關注不迷路 &#x1f449; 點擊關注不迷路 文章大綱 PostgreSQL金融風控分析之風險指標可視化監控實戰一、引言二、案例背景三、數據準備&#xff08;一&#xff09;數據來源與字段說明&#xff08;二&#xff09;數據清洗 四、…

屏幕與觸摸調試

本章配套視頻介紹: 《28-屏幕與觸摸設置》 【魯班貓】28-屏幕與觸摸設置_嗶哩嗶哩_bilibili LubanCat-RK3588系列板卡都支持mipi屏以及hdmi顯示屏的顯示。 19.1. 旋轉觸摸屏 參考文章 觸摸校準 參考文章 旋轉觸摸方向 配置觸摸旋轉方向 1 2 # 1.查看觸摸輸入設備 xinput…

AbstractQueuedSynchronizer之AQS

一、前置知識 公平鎖和非公平鎖&#xff1a; 公平鎖&#xff1a;鎖被釋放以后&#xff0c;先申請的線程先得到鎖。性能較差一些&#xff0c;因為公平鎖為了保證時間上的絕對順序&#xff0c;上下文切換更頻繁 非公平鎖&#xff1a;鎖被釋放以后&#xff0c;后申…

內存泄漏系列專題分析之十一:高通相機CamX ION/dmabuf內存管理機制Camx ImageBuffer原理

【關注我,后續持續新增專題博文,謝謝!!!】 上一篇我們講了:內存泄漏系列專題分析之八:高通相機CamX內存泄漏&內存占用分析--通用ION(dmabuf)內存拆解 這一篇我們開始講: 內存泄漏系列專題分析之十一:高通相機CamX ION/dmabuf內存管理機制Camx ImageBuf…

《類和對象(下)》

引言&#xff1a; 書接上回&#xff0c;如果說類和對象&#xff08;上&#xff09;是入門階段&#xff0c;類和對象&#xff08;中&#xff09;是中間階段&#xff0c;那么這次的類和對象&#xff08;下&#xff09;就可以當做類和對象的補充及收尾。 一&#xff1a;再探構造…

Java MVC

在軟件開發中&#xff0c;MVC&#xff08;Model-View-Controller&#xff09;是一種常用的設計模式&#xff0c;它將應用程序分為三個核心部分&#xff1a;模型&#xff08;Model&#xff09;、視圖&#xff08;View&#xff09;和控制器&#xff08;Controller&#xff09;。這…

嵌入式學習筆記 - 關于單片機的位數

通常我們經常說一個單片機是8位的&#xff0c;16位的&#xff0c;32位的&#xff0c;那么怎么判斷一款單片機的位數是多少位呢&#xff0c;判斷的依據是什么呢&#xff0c; 一 單片機的位數 單片機的位數是指單片機數據總線的寬度&#xff0c;也就是一次能處理的數據的位數&a…

推薦幾個常用免費的文本轉語音工具

推薦幾個常用免費的文本轉語音工具 在數字內容創作的時代&#xff0c;文本轉語音(TTS)技術已經成為內容創作者的得力助手。無論是制作視頻配音、有聲讀物、還是為網站增加語音功能&#xff0c;這些工具都能大幅提高創作效率。今天&#xff0c;我將為大家推薦幾款優質的免費文本…

Microsoft Azure DevOps針對Angular項目創建build版本的yaml

Azure DevOps針對Angular項目創建build版本的yaml&#xff0c;并通過變量控制相應job的執行與否。 注意事項&#xff1a;代碼前面的空格是通過Tab控制的而不是通過Space控制的。 yaml文件中包含一下內容&#xff1a; 1. 自動觸發build 通過指定code branch使提交到此代碼庫的…

Python Day23 學習

繼續SHAP圖繪制的學習 1. SHAP特征重要性條形圖 特征重要性條形圖&#xff08;Feature Importance Bar Plot&#xff09;是 SHAP 提供的一種全局解釋工具&#xff0c;用于展示模型中各個特征對預測結果的重要性。以下是詳細解釋&#xff1a; 圖的含義 - 橫軸&#xff1a;表示…