相交鏈表+判斷環型鏈表+求環型鏈表的入口節點

鏈表OJ題

  • 一.相交鏈表
  • 二.判斷環型鏈表
  • 三.求環型鏈表的入口節點

一.相交鏈表

相交鏈表

在這里插入圖片描述

相交:兩個鏈表從頭開始遍歷,尾節點一定是同一個節點。

情況一:當兩個鏈表長度相同時:
在這里插入圖片描述

情況二:當兩個鏈表長度不同時:

在這里插入圖片描述
思路:

  1. 求兩個鏈表長度的差值gap。
  2. 讓長鏈表先走gap個節點。
  3. 分別遍歷兩個鏈表,比較是否為同一個節點,若是則相交,否則不相交。

代碼如下:

typedef struct ListNode ListNode;struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) 
{ListNode* la = headA;ListNode* lb = headB;int lengthA = 0, lengthB = 0;while(la){lengthA++;//求鏈表A的長度la = la->next;}while(lb){lengthB++;//求鏈表B的長度lb = lb->next;}//求鏈表A與鏈表B長度差的絕對值int gap = abs(lengthA - lengthB);//找出長鏈表與短鏈表ListNode* longList = headA;ListNode* shortList = headB;if(lengthB > lengthA){longList = headB;shortList = headA;}//讓長鏈表先走gap個節點while(gap--){longList = longList->next;}//此時longList與shortList指針在相對的位置上(同時遍歷鏈表為NULL)//判斷兩個鏈表是否相交while(longList && shortList){if(longList == shortList){//鏈表相交return longList;}//兩個指針繼續往后走longList = longList->next;shortList = shortList->next;}//鏈表不相交return NULL;
}

二.判斷環型鏈表

環型鏈表

在這里插入圖片描述

思路:快慢指針,即慢指針一次?一步,快指針一次走兩步,兩個指針從鏈表起始位置開始行,如果鏈表帶環則一定會在環中相遇,否則快指針率先走到鏈表的未尾。

思考1:為什么快指針每次走兩步,慢指針走一步可以相遇,有沒有可能遇不上,請推理證明!
在這里插入圖片描述

因此,在帶環鏈表中慢指針走一步,快指針走兩步最終一定會相遇。

思考2:快指針一次走3步,走4步,…n步行嗎?

在這里插入圖片描述
在這里插入圖片描述

思考:真的存在N是奇數,C是偶數這一條件???

下面給出等式:
在這里插入圖片描述

在這里插入圖片描述

代碼如下:

  1. 慢指針一次走一步,快指針一次走兩步
typedef struct ListNode ListNode;bool hasCycle(struct ListNode* head)
{ListNode* slow = head;ListNode* fast = head;while (fast && fast->next){//慢指針一次走一步,快指針一次走兩步slow = slow->next;fast = fast->next->next;//當慢指針 == 快指針時,有環if (slow == fast){return true;}}//無環return false;
}
  1. 慢指針一次走一步,快指針一次走三步:
typedef struct ListNode ListNode;bool hasCycle(struct ListNode *head) 
{ListNode* slow = head;ListNode* fast = head;while(fast && fast->next && fast->next->next){//慢指針一次走一步,快指針一次走三步slow = slow->next;fast = fast->next->next->next;//當慢指針 == 快指針時,有環if(slow == fast){return true;}}//無環return false;
}

三.求環型鏈表的入口節點

環型鏈表 ||

在這里插入圖片描述

思路:快慢指針,快指針一次走兩步,慢指針一次走一步,若為環型鏈表最終在環中相遇,然后讓一個指針從相遇點開始走,一個指針從起點開始走,一次走一步,最終在進環處相遇。

在這里插入圖片描述

代碼如下:

//解:快慢指針,快指針一次走兩步,慢指針一次走一步,若為環型鏈表最終在環中相遇//    然后讓一個指針從相遇點開始走,一個指針從起點開始走,一次走一步,最終在進環處相遇typedef struct ListNode ListNode;struct ListNode* detectCycle(struct ListNode* head)
{ListNode* slow = head;ListNode* fast = head;while (fast && fast->next){slow = slow->next;fast = fast->next->next;if (slow == fast){//有環ListNode* meet = slow;//相遇點while (meet != head){//一個指針從相遇點開始走,一個指針從起點開始走,最終一定在入環點相遇head = head->next;meet = meet->next;}return meet;//入環點}}return NULL;//無環
}

在這里插入圖片描述

typedef struct ListNode ListNode;struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) 
{ListNode* la = headA;ListNode* lb = headB;int lengthA = 0, lengthB = 0;while(la){lengthA++;//求鏈表A的長度la = la->next;}while(lb){lengthB++;//求鏈表B的長度lb = lb->next;}//求鏈表A與鏈表B長度差的絕對值int gap = abs(lengthA - lengthB);//找出長鏈表與短鏈表ListNode* longList = headA;ListNode* shortList = headB;if(lengthB > lengthA){longList = headB;shortList = headA;}//讓長鏈表先走gap個節點while(gap--){longList = longList->next;}//此時longList與shortList指針在相對的位置上(同時遍歷鏈表為NULL)//判斷兩個鏈表是否相交while(longList && shortList){if(longList == shortList){//鏈表相交return longList;}//兩個指針繼續往后走longList = longList->next;shortList = shortList->next;}//鏈表不相交return NULL;
}struct ListNode *detectCycle(struct ListNode *head) 
{ListNode* slow = head;ListNode* fast = head;while(fast && fast->next){slow = slow->next;fast = fast->next->next;if(slow == fast){//有環ListNode* meet = slow;//相遇點ListNode* newHead = meet->next;meet->next = NULL;return getIntersectionNode(head, newHead); }}return NULL;//無環
}

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

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

相關文章

考研黨暑假回家還是留校,暑假回家就一定完蛋嗎?

考研我建議最好還是留校,因為環境比較好! 并不是說回家復習就一定不好,回家要面臨三大“敵人”: 1、我們本身的惰性,這個無需多言,在自己熟悉的環境,自己一個人,手機電腦網絡零食俱…

python條件

條件語句 if語句 if...else語句 if...elif...else語句 嵌套 is is 是一個身份運算符,用于比較兩個對象的身份,即它們在內存中的地址是否相同。這與比較兩個對象是否相等的 運算符不同。 運算符比較的是兩個對象的值是否相等。 比較對象 比較基本數據…

【Unity】RPG2D龍城紛爭(十一)戰斗系統之回合制驅動

更新日期:2024年7月11日。 項目源碼:第五章發布(正式開始游戲邏輯的章節) 索引 簡介一、開始關卡二、進入指定回合三、玩家結束當前回合四、進入下一回合五、通關條件六、檢測關卡狀態簡介 通過前兩篇的工作,我們的角色已經能夠進行移動、戰斗了,此刻,便進入第三個板塊…

React基礎學習-Day04

React基礎學習-Day04 常見的鉤子函數及基礎使用方式 1.useState useState 是 React 的一個 Hook,用于在函數組件中添加狀態。它返回一個狀態變量和一個更新該狀態的函數。與類組件的 this.state 和 this.setState 相對應,useState 讓函數組件也能擁有…

存儲實驗:Linux掛載iscsi硬盤與華為OceanStor創建LUN全流程

目錄 目的環境規劃實驗實驗流程Centos配置0. 關閉防火墻1. 設置網卡信息2. 配置路由3. iscsiadm連接存儲 iSCSI LUN創建(以華為OceanStor為例)驗證1. 驗證是否成功2. 開啟自動掛載 目的 實現Linux連接iscsi硬盤,同時實現開機自啟掛載 環境規…

掌握本地倉儲:Gradle本地倉庫配置全指南

掌握本地倉儲:Gradle本地倉庫配置全指南 在構建自動化的領域中,Gradle以其靈活性和強大的依賴管理功能脫穎而出。管理項目依賴時,經常需要配置本地倉庫以優化構建速度、控制依賴版本或支持離線構建。本文將深入探討如何在Gradle中配置本地倉…

JAVA----泛型

泛型 認識泛型 定義類、接口、方法時,同時聲明了一個或者多個類型變量(如:) ,稱為泛型類、泛型接口,泛型方法、它們統稱為泛型。 作用:利用泛型,可以限制集合存儲數據的類型. 泛型…

Gitee簡易使用流程(后期優化)

目錄 1.修改用戶名 2.文件管理 新建文件/文件夾流程如下: 上傳文件流程如下: 以主頁界面為起點 1.修改用戶名 點解右上角的頭像--> 點擊“賬號設置” 點擊左邊欄里的“個人資料“ 直接修改用戶名即可 2.文件管理 選擇一個有修改權限倉庫&#…

【從0到1進階Redis】主從復制

筆記內容來自B站博主《遇見狂神說》:Redis視頻鏈接 1、概念 主從復制,是指將一個臺 Redis 服務器的數據,復制到其他的 Redis 服務器。前者稱為主節點(master/leader),后者稱為從節點(slave/foll…

this指向解析

先看題目: 第一題: var name window var person1 { name: person1, show1: function () { console.log(this.name) }, show2: () > console.log(th show3: function () { return function () { …

MFC之對話框--重繪元文件

文章目錄 實現示例展示需要繪制的窗口/位置控件位置更新下一次示例粗細滑動部分更新 重繪元文件(窗口變化內容消失)方法一:使用元文件方法二:兼容設備方法三:使用自定義類存儲繪圖數據除畫筆外功能處理畫筆功能處理 保…

springmvc1

以前的servlet程序: springmvc 不同的處理器:不同的方法或者處理類 所有的請求都會經過dispathcherservlet的doservice方法: mvc原理: 前端控制器:jsp或者什么東西

Python字符串基礎與高級操作

在Python中,字符串是不可變的數據類型,用于存儲一系列的字符。它們可以被創建、訪問、操作和格式化,但一旦創建,其內容就不能改變。下面是一篇關于Python字符串技術的詳細講解,包括創建、訪問、更新、轉義、運算符、格…

Phpstudy 2018 之xhcms搭建

1、由于直接訪問根目錄無法進入網站 2、所以采用搭建網站,第一使用系統服務模式、選擇php-5.4.45Apache模式 3、網站域名為本地ip地址或者127.0.0.1、端口8085 4、在navicat創建名字為xjcms的數據庫,并導入sql數據庫文件 5、瀏覽器輸入127.0.0.1:8085直接…

中風傷寒、感冒、六經辨證筆記

目錄 基礎傳經的原因傳經的過程及速度傳經的危害感冒時體痛頭痛的原因根據頭痛的位置辨經 太陽病太陽中風外風內熱 表虛感冒顆粒(桂枝葛根湯) 少陽病辨病總結傷寒論原文半表半里太陽為開,陽明為闔,少陽為樞膽的作用幫助腸胃消化、…

deepstream讀取mp4文件及不同類型視頻輸入bug解決

在deepstream中使用mp4文件,與rtsp類似,使用uridecodebin即可,(可見官方test.py文件) def create_source_bin(index, uri):print("Creating source bin")# Create a source GstBin to abstract this bins c…

定投投什么?

定投可以選擇的品種有銀行理財和基金 銀行理財目前有的品種有期限限制,不是那么公開的特點。如果說你想通過定投積累一筆低風險的,用于應急或者短期內要用的錢,可以選擇定投現金類銀行理財。 基金是最適合定投的產品, 基金分為…

【自然語言處理】面向新冠肺炎的社會計算應用

面向新冠肺炎的社會計算應用 1 任務目標 1.1 案例簡介 新冠肺炎疫情牽動著我們每一個人的心,在這個案例中,我們將嘗試用社會計算的方法對疫情相關的新聞和謠言進行分析,助力疫情信息研究。本次作業為開放性作業,我們提供了疫情…

C++ STL stable_sort用法

一&#xff1a;功能 對區間內元素進行排序&#xff0c;保證相等元素的順序&#xff08;穩定排序&#xff09; 二&#xff1a;用法 #include <iostream>struct Record {std::string label;int rank; };int main() {std::vector<Record> data {{"q", 1},…

代碼隨想錄第五十一天 | 300.最長遞增子序列 , 674. 最長連續遞增序列 , 718. 最長重復子數組

300.最長遞增子序列 看完想法&#xff1a;在dp遞推公式那里沒有太看得懂。首先dp【i】的狀態肯定是由前面的dp【0】到dp【i-1】推出的&#xff0c;但是dp【0】到dp【i-1】可以推出dp【i】有個前提就是(nums【i】 > nums【0到i-1任意一個】),例如nums【1】 2, nums【3】 5…