鏈表面試題9之環形鏈表進階

那么上一題我們已經知道了雙指針的變法以及拓展的用法,那么這里我們直接難度升級。

想回去復習的這里放個鏈接:鏈表的面試題8之環形鏈表-CSDN博客

題目鏈接:142. 環形鏈表 II - 力扣(LeetCode)

?我們來看這道題目主要想讓我們干什么,上一題是讓我們去判斷是否為環形鏈表,而這一題是直接告訴你這就是一個環形鏈表,讓你自己去探尋環形鏈表各節點的關系,用地址來判斷這個節點是否是第一個成環的節點。

當然這一題還是用雙指針的解法,至于為什么很簡單,單指針解決不了這個問題唄。我們上一題探討過快慢指針的步調的大小,涉及快慢指針的算法題中,通常習慣使用快指針每次走兩步,慢指針走一步的方式。

這里我們需要判斷的難點是什么??

我們之前用到的快慢指針都是通過他們的距離差讓這兩個指針相遇來得出這個是環形鏈表,但是這里我們相遇的點萬一不是第一個點呢??那么我們的判斷不就成了無效判定了嗎?所以我們篤定一點,這道題像上一道題那樣的關系判斷是不可取的,我們應該找其他的關系,使得讓兩個節點一定在第一個成環的節點相遇。

那我們直接來畫圖看一下:

這里我們設從頭節點到入環的第一個節點的距離為a,設環長為c。

再設相遇的時候,慢指針走了b步,那么這里快指針就走了2b步。

再設快指針比慢指針多走了k圈環,那么我們就能得到2b-b=kc,即b=kc。

再看我們的慢指針,從頭節點開始,到相遇點走了b-a步,也就是(kc-a)步。

這也就是說,從相遇點開始,再走a步,就會到達我們的入環點。

為什么?

因為環長就是c,看圖中的箭頭,一根箭頭代表一個長度。所以再走a步,也就是說(kc-a+a)=kc步

也就是在入環口處。那么哪里還有a步的地方呢?

我再往圖里一看,那就是頭節點處,所以我如果讓指針從頭節點和相遇點處分別開始移動,那么兩個人步伐都為1的情況下肯定會在入環口處相遇。

結論就是:讓一個指針從鏈表起始位置開始遍歷鏈表,同時讓一個指針從判環時相遇點的位置開始繞環運行,兩個指針都是每次均走一步,最終肯定會在入口點的位置相遇。

但要注意一點:指針從相遇點開始,移動 a 步后恰好走到入環口,但在這個過程中,可能會多次經過入環口。 因為環長和入環前的長度可能會有誤差。

struct ListNode* detectCycle(struct ListNode* head) {struct ListNode* slow = head;struct ListNode* fast = head;while (fast && fast->next) {slow = slow->next;fast = fast->next->next;if (fast == slow) { // 相遇while (slow != head) { // 再走 a 步slow = slow->next;head = head->next;}return slow;}}return NULL;
}

這里把代碼貼一下,整個思路是非常清晰的,效率也非常高。

時間復雜度:O(n),其中 n 為鏈表的長度。
空間復雜度:O(1),僅用到若干額外變量。

這里再帶大家注意兩點推導設條件的前提:1.慢指針在進入環之前,快指針就已經在環內至少走了n圈,而n至少為1。因為快指針至少要走一圈,才能與后進入的慢指針相遇。

2.慢指針進環之后,快指針肯定會在慢指針走一圈之內追上慢指針
因為:慢指針進環后,快慢指針之間的距離最多就是環的長度,而兩個指針在移動時,每次它們至今的距離都縮減一步,因此在慢指針移動一圈之前快指針肯定是可以追上慢指針的。

好了,這道題就講到這里

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

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

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

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

相關文章

游戲引擎學習第299天:改進排序鍵 第二部分

回顧并為當天內容做準備 我們會現場編寫完整的游戲代碼。回顧上周發現自己對游戲中正確的排序規則并沒有清晰的理解。主要原因是我們更擅長三維游戲開發,缺乏二維游戲和二維游戲技術的經驗,對于二維精靈排序、模擬三維效果的最佳方案等沒有太多技巧和經…

Redis從入門到實戰 - 高級篇(中)

一、多級緩存 1. 傳統緩存的問題 傳統的緩存策略一般是請求到達Tomcat后,先查詢Redis,如果未命中則查詢數據庫,存在下面的問題: 請求要經過Tomcat處理,Tomcat的性能成為整個系統的瓶頸Redis緩存失效時,會…

Python訓練營打卡 Day31

文件的規范拆分和寫法 今日的示例代碼包含2個部分 notebook文件夾內的ipynb文件,介紹下今天的思路項目文件夾中其他部分:拆分后的信貸項目,學習下如何拆分的,未來你看到的很多大項目都是類似的拆分方法 知識點回顧:文件…

2025年護網行動藍隊防御全解析:構建智能動態防御體系

2025年,隨著網絡攻擊手段的智能化、混合化升級,護網行動中的藍隊防御已從傳統的被動防護轉向“動態感知、智能研判、主動反制”的立體化模式。如何在攻防不對稱的對抗中實現“看得見、防得住、溯得清”?本文將結合前沿技術與實戰經驗&#xf…

React Contxt詳解

React Contxt詳解 React 的 Context API 是用于跨組件層級傳遞數據的解決方案,尤其適合解決「prop drilling」(多層組件手動傳遞 props)的問題。以下是關于 Context 的詳細解析: 文章目錄 React Contxt詳解一、Context 核心概念二…

使用 lock4j-redis-template-spring-boot-starter 實現 Redis 分布式鎖

在分布式系統中,多個服務實例可能同時訪問和修改共享資源,從而導致數據不一致的問題。為了解決這個問題,分布式鎖成為了關鍵技術之一。本文將介紹如何使用 lock4j-redis-template-spring-boot-starter 來實現 Redis 分布式鎖,從而…

Vue響應式系統演進與實現解析

一、Vue 2 響應式實現詳解 1. 核心代碼實現 // 依賴收集器(觀察者模式) class Dep {constructor() {this.subscribers new Set();}depend() {if (activeEffect) {this.subscribers.add(activeEffect);}}notify() {this.subscribers.forEach(effect &g…

Mujoco 學習系列(一)安裝與部署

這個系列文章用來記錄 Google DeepMind 發布的 Mujoco 仿真平臺的使用過程,Mujoco 是具身智能領域中非常知名的仿真平臺,以簡單易用的API和精準的物理引擎而著稱(PS:原來Google能寫好API文檔啊),也是我平時…

Ai學習之openai api

一、什么是openai api 大家對特斯拉的馬斯克應該是不陌生的,openai 就是馬斯克投資的一家研究人工智能的公司,它就致力于推動人工智能技術的發展,目標是確保人工智能對人類有益,并實現安全且通用的人工智能。 此后,O…

leetcode 合并區間 java

用 ArrayList<int[]> merged new ArrayList<>();來定義數組的list將數組進行排序 Arrays.sort(intervals,(a,b) -> Integer.compare(a[0],b[0]));如果前面的末尾>后面的初始&#xff0c;那么新的currentInterval的末尾這兩個數組末尾的最大值&#xff0c;即…

std::vector<>.emplace_back

emplace_back() 詳解&#xff1a;C 就地構造的效率革命 emplace_back() 是 C11 引入的容器成員函數&#xff0c;用于在容器尾部就地構造&#xff08;而非拷貝或移動&#xff09;元素。這一特性顯著提升了復雜對象的插入效率&#xff0c;尤其適用于構造代價較高的類型。 一、核…

Dify實戰案例《AI面試官》更新,支持語音交互+智能知識庫+隨機題庫+敏感詞過濾等...

大模型應用課又更新了&#xff0c;除了之前已經完結的兩門課&#xff08;視頻圖文&#xff09;&#xff1a; 《Spring AI 從入門到精通》《LangChain4j 從入門到精通》 還有目前正在更新的 《Dify 從入門到實戰》 本周也迎來了一大波內容更新&#xff0c;其中就包括今天要介紹…

AGI大模型(29):LangChain Model模型

1 LangChain支持的模型有三大類 大語言模型(LLM) ,也叫Text Model,這些模型將文本字符串作為輸入,并返回文本字符串作為輸出。聊天模型(Chat Model),主要代表Open AI的ChatGPT系列模型。這些模型通常由語言模型支持,但它們的API更加結構化。具體來說,這些模型將聊天消…

動態IP技術在跨境電商中的創新應用與戰略價值解析

在全球化4.0時代&#xff0c;跨境電商正經歷從"流量紅利"向"技術紅利"的深度轉型。動態IP技術作為網絡基礎設施的關鍵組件&#xff0c;正在重塑跨境貿易的運營邏輯。本文將從技術架構、應用場景、創新實踐三個維度&#xff0c;揭示動態IP如何成為跨境電商突…

android雙屏之副屏待機顯示圖片

摘要&#xff1a;android原生有雙屏的機制&#xff0c;但需要芯片廠商適配框架后在底層實現。本文在基于芯發8766已實現底層適配的基礎上&#xff0c;僅針對上層Launcher部分對系統進行改造&#xff0c;從而實現在開機后副屏顯示一張待機圖片。 副屏布局 由于僅顯示一張圖片&…

STM32之中斷

一、提高程序實時性的架構方案 輪詢式 指的是在程序運行時&#xff0c;首先對所有的硬件進行初始化&#xff0c;然后在主程序中寫一個死循環&#xff0c;需要運行的功能按照順序進行執行&#xff0c;輪詢系統是一種簡單可靠的方式&#xff0c;一般適用于在只需要按照順序執行…

LLM應用開發平臺資料

課程和代碼資料 放下面了&#xff0c;自取&#xff1a; https://pan.quark.cn/s/57a9d22d61e9

硬盤健康檢測與性能測試的實踐指南

在日常使用 Windows 系統的過程中&#xff0c;我們常常需要借助各種工具來優化性能、排查問題或管理文件。針對windows工具箱進行實測解析&#xff0c;發現它整合了多種實用功能&#xff0c;能夠幫助用戶更高效地管理計算機。 以下為測試發現的功能特性&#xff1a; 硬件信息查…

正則表達式進階(三):遞歸模式與條件匹配的藝術

在正則表達式的高級應用中&#xff0c;遞歸模式和條件匹配是處理復雜嵌套結構和動態模式的利器。它們突破了傳統正則表達式的線性匹配局限&#xff0c;能夠應對嵌套括號、HTML標簽、上下文依賴等復雜場景。本文將詳細介紹遞歸模式&#xff08;(?>...)、 (?R) 等&#xff0…

從零開始創建React項目及制作頁面

一、React 介紹 React 是一個由 Meta&#xff08;原Facebook&#xff09; 開發和維護的 開源JavaScript庫&#xff0c;主要用于構建用戶界面&#xff08;User Interface, UI&#xff09;。它是前端開發中最流行的工具之一&#xff0c;廣泛應用于單頁應用程序&#xff08;SPA&a…