【數據結構】LeetCode160.相交鏈表 138.隨即鏈表復制 牛客——鏈表回文問題

文章目錄

    • 一、相交鏈表問題
      • 問題描述
      • 解題思路分析
        • 思路一:暴力遍歷法
        • 思路二:雙指針對齊法(最優解)
    • 二、鏈表的回文結構
      • 問題描述
      • 解題思路
      • 完整代碼
    • 三、 隨即鏈表的復制
      • 問題描述
      • 解題思路
      • 復雜度分析

一、相交鏈表問題

問題描述

給定兩個單鏈表,判斷它們是否相交,若相交則返回相交的節點。(注意:判斷依據是節點地址是否相同,而非節點值,因為節點值可能存在重復。)


在這里插入圖片描述

解題思路分析

思路一:暴力遍歷法
  • 方法:遍歷鏈表A,對于A中的每一個節點,遍歷整個鏈表B,檢查是否存在地址相同的節點。
  • 時間復雜度:O(M*N)(若兩鏈表長度分別為M和N)
  • 空間復雜度:O(1)
  • 缺點:效率低,不適用于長鏈表。
思路二:雙指針對齊法(最優解)
  • 方法:
    1. 分別遍歷兩個鏈表,計算各自長度。
    2. 求出兩鏈表長度差 gap
    3. 讓較長的鏈表的指針先移動 gap 步。
    4. 然后兩個指針同時移動,逐個比較節點地址,第一個相同的節點即為交點。
  • 時間復雜度:O(M + N)
  • 空間復雜度:O(1)
  • 優點:高效,適用于任意長度的鏈表。

在這里插入圖片描述

思路2的時間復雜度更低,所以我們選擇思路2

具體代碼如下

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {struct ListNode* curA=headA,*curB=headB;int lenA=1,lenB=1;while(curA->next){curA=curA->next;lenA++;}while(curB->next){curB=curB->next;lenB++;}int gap=abs(lenA-lenB);//假設法 先假設A長struct ListNode* longList=headA;struct ListNode* shortList=headB;if(lenA<lenB){longList=headB;shortList=headA;}while(gap--){longList=longList->next;}while(longList){if(longList==shortList)return longList;longList=longList->next;shortList=shortList->next;}return NULL;
}

二、鏈表的回文結構

問題描述

判斷一個單鏈表是否為回文結構。即正著讀和反著讀都一樣

在這里插入圖片描述

解題思路

回文鏈表判斷的關鍵在于對稱性驗證。我們可以通過以下步驟實現:

  1. 找到中間節點:使用快慢指針法,快指針每次走兩步,慢指針每次走一步,當快指針到達末尾時,慢指針正好在中間。
  2. 反轉后半部分鏈表:從中間節點開始,將后半部分鏈表反轉。
  3. 比較前后兩部分:從頭節點和反轉后的中間節點開始,逐個比較節點值是否相同。

完整代碼

class PalindromeList {
public://尋找中間節點
struct ListNode* middleNode(struct ListNode* head) {// 初始化快慢指針struct ListNode* slow = head;struct ListNode* fast = head;// 移動指針直到fast到達鏈表末尾while (fast != NULL && fast->next != NULL) {slow = slow->next;      // 慢指針每次移動一步fast = fast->next->next; // 快指針每次移動兩步}return slow; // 慢指針指向中間節點
}//反轉鏈表
struct ListNode* reverseList(struct ListNode* head) {struct ListNode* n1, *n2, *n3;n1 = NULL;n2 = head;if (n2)n3 = n2->next;while (n2) {n2->next = n1;n1 = n2;n2 = n3;if (n3)n3 = n3->next;}return n1;
}bool chkPalindrome(ListNode* A) {// write code herestruct ListNode*mid=middleNode(A);struct ListNode*rmid=reverseList(mid);while(rmid&&A){if(rmid->val!=A->val)return false;rmid=rmid->next;A=A->next;}return true;
}};

三、 隨即鏈表的復制

問題描述

實現一個函數,復制一個含有隨機指針的鏈表。隨機指針可以指向鏈表中的任何節點或為空。

在這里插入圖片描述

解題思路

常規鏈表的復制很簡單,但隨機指針的存在使得問題復雜化。因為隨機指針可能指向尚未復制的節點。我們可以通過以下三步解決:

  1. 插入拷貝節點:在原鏈表的每個節點后插入一個拷貝節點,值與原節點相同。
  2. 設置隨機指針:拷貝節點的隨機指針應指向原節點隨機指針所指節點的下一個節點(即其拷貝)。
  3. 分離鏈表:將混合鏈表分離為原鏈表和拷貝鏈表。

在這里插入圖片描述

struct Node* copyRandomList(struct Node* head) {//拷貝節點插到原節點后邊
struct Node*cur=head;while(cur)
{struct Node* copy=(struct Node*)malloc(sizeof(struct Node));//分配內存copy->next=cur->next;cur->next=copy;copy->val=cur->val;cur=copy->next;//cur走到原鏈表的下一個  
}
//控制randomcur=head;
while(cur)
{struct Node* copy = cur->next;if(cur->random==NULL)//不要寫成random==NULL{copy->random=NULL;}else{copy->random=cur->random->next;//核心代碼}cur=copy->next;
}//把拷貝鏈表尾插起來
struct Node* copyhead=NULL,*copytail=NULL;cur=head;
while(cur)
{struct Node*copy=cur->next;if(copytail==NULL){copyhead=copytail=copy;}else{copytail->next=copy;copytail=copytail->next;}cur=copy->next;
}
return copyhead;
}

復雜度分析

  • 時間復雜度:O(N),三次遍歷鏈表。
  • 空間復雜度:O(1),除了返回的拷貝鏈表外,僅使用了常數個額外指針。

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

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

相關文章

Mysql InnoDB 底層架構設計、功能、原理、源碼系列合集【四、事務引擎核心 - MVCC與鎖機制】

Mysql InnoDB 底層架構設計、功能、原理、源碼系列合集 一、InnoDB 架構先導。【模塊劃分&#xff0c;各模塊功能、源碼位置、關鍵結構體/函數】 二、內存結構核心 - 緩沖池與性能加速器 三、日志系統 - 事務持久化的基石 四、事務引擎核心 - MVCC與鎖機制 五、InnoDB 高階…

[ pytorch ] 基于CLIP的zero-shot圖像分類

論文&#xff1a;Learning Transferable Visual Models From Natural Language Supervision 地址&#xff1a;Learning Transferable Visual Models From Natural Language Supervision 一、關于CLIP 基于圖文匹配的特征學習&#xff1a;該論文證明了預測哪個標題與哪個圖像…

SP95N65CTO:一款高性能650V SiC MOSFET的全面解析

碳化硅&#xff08;SiC&#xff09;功率器件因其優異的性能&#xff0c;在高頻、高溫、高效率的應用中越來越受到重視。本文將以SP95N65CTO為例&#xff0c;詳細介紹這款650V SiC MOSFET的關鍵特性、電氣參數與應用場景。一、產品概述SP95N65CTO是一款采用TOLI&#xff08;TO-2…

week4-[二維數組]平面上的點

week4-[二維數組]平面上的點 題目描述 有 NNN 個二維平面上的點&#xff0c;每個點的坐標都是整數且坐標范圍都在 0~9990\sim 9990~999 之間&#xff0c;求其中出現最頻繁的點的出現次數及其坐標。 輸入格式 第一行有一個整數 NNN&#xff0c;表示平面上點的個數。 接下來 NN…

領域專用AI模型訓練指南:醫療、法律、金融三大垂直領域微調效果對比

領域專用AI模型訓練指南&#xff1a;醫療、法律、金融三大垂直領域微調效果對比 &#x1f31f; Hello&#xff0c;我是摘星&#xff01; &#x1f308; 在彩虹般絢爛的技術棧中&#xff0c;我是那個永不停歇的色彩收集者。 &#x1f98b; 每一個優化都是我培育的花朵&#xff0…

在自動駕駛中ESKF實現GINS時,是否將重力g作為變量考慮進去的目的是什么?

在自動駕駛的ESKF中&#xff0c;是否將重力 g 作為估計變量&#xff0c;可以從多個維度來比較這兩種方法的差異。對比維度不將重力 g 作為變量將重力 g 作為變量核心假設重力矢量 g 是已知且恒定的完美參考量。重力矢量 g 是需要被估計或校準的量&#xff0c;其值可能存在不確定…

Dify 從入門到精通(第 55/100 篇):Dify 的模型微調(進階篇)

Dify 從入門到精通&#xff08;第 55/100 篇&#xff09;&#xff1a;Dify 的模型微調 Dify 入門到精通系列文章目錄 第一篇《Dify 究竟是什么&#xff1f;真能開啟低代碼 AI 應用開發的未來&#xff1f;》介紹了 Dify 的定位與優勢第二篇《Dify 的核心組件&#xff1a;從節點…

《Password Guessing Using Large Language Models》——論文閱讀

1.研究背景LLM在文本生成和理解方面表現出色&#xff0c;但直接用于密碼猜測存在以下問題&#xff1a;密碼與自然語言的差異&#xff08;短、無語法、需精確匹配&#xff09;生成效率低、重復率高倫理限制&#xff08;如GPT-4拒絕生成大量密碼&#xff09;2.本文研究提出PASSLL…

C# 使用OPCUA 與CODESYS進行標簽通訊

目錄 1.導出的標簽 識別標簽名稱 2.引用OPCUA的包 3.讀寫方法的封裝 4.完整的業務模塊封裝 1.導出的標簽 識別標簽名稱 從CODESYS導出使用標簽通訊的模塊文檔 大概是這樣子的 <?xml version"1.0" encoding"utf-8"?> <Symbolconfiguratio…

C++ 中 `std::map` 的 `insert` 函數

1. 函數的概念與用途 std::map::insert 是 C 標準模板庫&#xff08;STL&#xff09;中 map 容器的一個核心成員函數。它的核心任務很明確&#xff1a;向 map 中插入一個新的鍵值對&#xff08;key-value pair&#xff09;。 核心用途&#xff1a; 數據構建&#xff1a;初始化一…

【機器學習學習筆記】機器學習引言

前言本文章是撥珠自己的學習筆記&#xff0c;自用為主&#xff0c;學習請移步專門教程&#xff0c;若有錯誤請大佬輕噴&#xff0c;也歡迎同好交流學習。本文將闡述三個問題。什么是機器學習&#xff1f;監督學習、無監督學習到底在干什么&#xff1f;分類、回歸、聚類又是怎么…

程序設計---狀態機

在軟件工程、嵌入式開發、自動化控制等領域&#xff0c;狀態機&#xff08;State Machine&#xff09;是一種描述系統行為的強大工具。它通過抽象“狀態”“事件”“轉換”和“動作”四大核心要素&#xff0c;將復雜的邏輯流程轉化為可視化、可驗證的狀態流轉規則&#xff0c;廣…

GaussDB 數據庫架構師修煉(十八) SQL引擎-分布式計劃

1 分布式架構GaussDB基于MPP &#xff08;Massively Parallel Processing&#xff09; 并行架構Streaming流式計算框架2 分布式計劃CN輕量化&#xff08;light proxy&#xff09; FQS&#xff08; fast query shipping &#xff09; STREAM計劃 XC計劃計劃類型場景原理CN…

微前端架構核心要點對比

1. 樣式隔離 常見的隔離方式有以下幾種,還是根據自身業務來確定: 1.1. shadowDOM 目前相對來說使用最多的樣式隔離機制。 但shadowDOM并不是銀彈,由于子應用的樣式作用域僅在 shadow 元素下,那么一旦子應用中出現運行時“翻墻”跑到外面構建 DOM 的場景,必定會導致構建…

VMware 17.6安裝包下載與保姆級圖文安裝教程!

軟件下載 [軟件名稱]&#xff1a;VMware 17.6 [軟件大小]&#xff1a;226.66MB [系統環境]&#xff1a;win 7/8/10/11或更高&#xff0c;64位操作系統 VMware合集&#xff0c;軟件下載&#xff08;夸克網盤需手機打開&#xff09;&#xff1a;&#xff1a;VMware合集丨夸克網…

關于微服務下的不同服務之間配置不能通用的問題

問題引入現有兩個服務&#xff0c;一個是 A 服務&#xff0c;一個是 B 服務&#xff0c;并且這兩個服務都需要使用 mysql。現 B 服務中引入了 A 服務的依賴&#xff0c;在 A 服務中添加了 mysql 的相關配置&#xff0c;那么這時就有一個問題&#xff1a;既然 B 已經引入了 A 的…

【機器學習項目 心臟病預測】

文章目錄心臟病預測導入數據集數據集介紹理解數據數據處理機器學習K近鄰分類器邏輯回歸支持向量分類器&#xff08;SVC&#xff09;決策樹分類器隨機森林分類器結論心臟病預測 在這個機器學習項目中&#xff0c;我們使用UCI心臟病數據集 UCI &#xff0c;并將使用機器學習方法…

【論文閱讀 | arXiv 2025 | WaveMamba:面向RGB-紅外目標檢測的小波驅動Mamba融合方法】

論文閱讀 | arXiv 2025 | WaveMamba&#xff1a;面向RGB-紅外目標檢測的小波驅動Mamba融合方法??1&&2. 摘要&&引言3. 方法3.1. 預備知識3.2. WaveMamba3.3. WaveMamba融合塊&#xff08;WMFB&#xff09;3.3.1. 低頻Mamba融合塊&#xff08;LMFB&#xff09;…

DevExpress發布PowerPoint Presentation API庫,支持跨平臺與 PDF 導出

DevExpress專注于為 .NET、JavaScript、VCL 等多種平臺提供高性能 UI 控件、報表工具、數據可視化組件及開發框架&#xff0c;產品覆蓋桌面、Web、移動及跨平臺應用開發領域。憑借穩定的性能、豐富的功能與優質的技術支持&#xff0c;DevExpress 的解決方案已廣泛應用于金融、制…

Vue3使用 DAG 圖(AntV X6)

參考文檔 AntV X6 文檔 可自定義設置以下屬性 容器寬度&#xff08;width&#xff09;&#xff0c;類型&#xff1a;number | string&#xff0c;默認 ‘100%’容器高度&#xff08;height&#xff09;&#xff0c;類型&#xff1a;number | string&#xff0c;默認 ‘100%’…