經典鏈表算法題:找到環的入口。清晰圖示推導出來

在這里插入圖片描述

Leetcode題目鏈接

原理

重畫鏈表如下所示,線上有若干個節點。記藍色慢指針為 slow,紅色快指針為 fast。初始時 slow 和 fast 均在頭節點處。
0208_2.png
使 slow 和 fast 同時前進,fast 的速度是 slow 的兩倍。當 slow 抵達環的入口處時,如下所示。
0208_3.png
其中:

  • head 和 A 的距離為 z z z
  • 弧 AB (沿箭頭方向) 的長度為 x x x
  • 同理,弧 BA 的長度為 y y y

可得:

  • slow 走過的步數為 z z z
  • 設 fast 已經走過了 k k k 個環, k ≥ 0 k \geq 0 k0,對應的步數為 z + k ( x + y ) + x z + k(x+y) + x z+k(x+y)+x

以上兩個步數中,后者為前者的兩倍,整理可得 z = x + k ( x + y ) z = x + k(x+y) z=x+k(x+y),替換如下所示。
0208_4.png
此時因為 fast 比 slow 快 1 個單位的速度,且弧 BA 的長度為整數,所以再經過 y 個單位的時間即可追上 slow。

即 slow 再走 y y y 步,fast 再走 2 y 2y 2y 步。設相遇在 C 點,位置如下所示,可得弧 AC 長度為 y。
0208_5.png
因為此前 x + y x + y x+y 為環長,所以弧 CA 的長度為 x x x
此時我們另用一橙色指針 ptr (pointer) 指向 head,如下所示。并使 ptr 和 slow 保持 1 個單位的速度前進,在經過 z = x + k ( x + y ) z = x + k(x+y) z=x+k(x+y) 步后,可在 A 處相遇。
0208_6.png
再考慮鏈表無環的情況,fast 在追到 slow 之前就會指向空節點,退出循環即可。

算法實現

Screenshot 2024-05-12 at 7.52.17 PM.png

復雜度

時間: Θ ( n ) \Theta(n) Θ(n)

  • 如果相交
    • fast 和 slow 相遇時 slow 走過的距離 ≤ n \leq n n,所以 fast 走過的距離 ≤ 2 n \leq 2n 2n
    • ptr 走過的距離 < n < n <n
    • slow 走過的距離 ≥ n \geq n n < < < fast 和 ptr 走過的距離之和。
  • 如果不相交,fast 走過 n n n 步即結束

空間: Θ ( 1 ) \Theta(1) Θ(1)

推廣

以下皆為個人所著,兼顧了職場面試和本碩階段的學術考試。

  • 附個人題解的雙指針題單
  • 圖論入門
  • 圖論進階

點贊關注不迷路,祝各位早日上岸,飛黃騰達!

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

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

相關文章

FFmpeg引用計數數據緩沖區相關的結構體:AVBuffer、AVBufferRef簡介

一、AVBuffer結構體的聲明 AVBuffer是一個用于引用計數數據緩沖區的應用程序編程接口&#xff0c;它表示數據緩沖區本身。它是不透明的&#xff0c;不能被直接訪問調用&#xff0c;只能通過AVBufferRef間接訪問它。但是可以通過比較兩個AVBuffer指針來檢查是否兩個不同的引用都…

MySQL——三大范式

為什么需要數據規范化&#xff1f; 信息重復 更新異常 插入異常&#xff1a;無法正常顯示信息 刪除異常&#xff1a;丟失有效的信息 三大范式 1. 第一范式&#xff08;1NF&#xff09; 原子性&#xff1a;保證每一列不可再分 2. 第二范式&#xff08;2NF&#xf…

【公益案例展】四川農擔x中電金信——大數據智能風控平臺建設

? 中電金信公益案例 本項目案例由中電金信投遞并參與數據猿與上海大數據聯盟聯合推出的 #榜樣的力量# 《2024中國數據智能產業最具社會責任感企業》榜單/獎項”評選。 大數據產業創新服務媒體 ——聚焦數據 改變商業 1、外部經濟環境帶來的挑戰 近幾年經濟發展和市場需求的挑…

【C語言】—— 文件操作(下)

【C語言】—— 文件操作&#xff08;下&#xff09; 前言&#xff1a;五、文件的順序讀寫5.1、 順序讀寫函數介紹5.2、 f p u t c fputc fputc 函數5.3、 f g e t c fgetc fgetc 函數5.4、 f p u t s fputs fputs 函數5.5、 f g e t s fgets fgets 函數5.6、 f p r i n t f…

2024 年 亞太賽 APMCM (C題)中文賽道國際大學生數學建模挑戰賽 | 量子計算的物流配送 | 數學建模完整代碼+建模過程全解全析

當大家面臨著復雜的數學建模問題時&#xff0c;你是否曾經感到茫然無措&#xff1f;作為2022年美國大學生數學建模比賽的O獎得主&#xff0c;我為大家提供了一套優秀的解題思路&#xff0c;讓你輕松應對各種難題&#xff01; 完整內容可以在文章末尾領取&#xff01; 該段文字…

C++內存管理(候捷)第一講 筆記

內存分配的每一層面 applications可以調用STL&#xff0c;里面會有allocator進行內存分配&#xff1b;也可以使用C 基本工具primitives&#xff0c;比如new, new[], new(), ::operator new()&#xff1b;還可以使用更底層的malloc和free分配和釋放內存。最底層的是系統調用&…

實現好友關注功能的Feed流設計

摘要 在社交網絡應用中&#xff0c;Feed流是展示好友動態的核心功能。本文將探討如何設計一個Feed流系統&#xff0c;以實現好友關注和動態展示的功能。 1. Feed流的基本概念 Feed流是用戶在社交網絡中獲取信息的一種方式&#xff0c;通常按照時間順序展示好友或感興趣的用戶…

Maven Archetype 自定義項目模板:高效開發的最佳實踐

文章目錄 前言一、Maven Archetype二、創建自定義 Maven Archetype三、定制 Archetype 模板四、手動創建 Archetype 模板項目五、FAQ5.1 如何刪除自定義的模板5.2 是否可以在模板中使用空文件夾 六、小結推薦閱讀 前言 在軟件開發中&#xff0c;標準化和快速初始化項目結構能夠…

調用asyncio.to_thread后上下文依然一致嗎

使用Python的asyncio時&#xff0c;可以把一個同步的函數放到線程池中執行從而避免這個函數阻塞asyncio自身的事件循環。比如可以把requests庫的請求放進去 async def to_thread_do_request(url):return await asyncio.to_thread(requests.get, url)這個to_thread_do_request方…

14-20 Vision Transformer用AI的畫筆描繪新世界

概述 毫無疑問,目前最受關注且不斷發展的最重要的主題之一是使用人工智能生成圖像、視頻和文本。大型語言模型 (LLM) 已展示出其在文本生成方面的卓越能力。它們在文本生成方面的許多問題已得到解決。然而,LLM 面臨的一個主要挑戰是它們有時會產生幻覺反應。 最近推出的新模…

分布式計算、異構計算與算力共享

目錄 算力 算力共享的技術支撐 云計算技術 邊緣計算技術 區塊鏈技術 分布式計算、異構計算與算力共享 分布式計算:計算力的“集團軍作戰” 異構計算:計算力的“多兵種協同” 算力共享:計算力的“共享經濟” 深入融合,共創計算新紀元 算力共享對科研領域的影響 …

openmetadata1.3.1 自定義連接器 開發教程

openmetadata自定義連接器開發教程 一、開發通用自定義連接器教程 官網教程鏈接&#xff1a; 1.https://docs.open-metadata.org/v1.3.x/connectors/custom-connectors 2.https://github.com/open-metadata/openmetadata-demo/tree/main/custom-connector &#xff08;一&…

Matplotlib 文本

可以使用 xlabel、ylabel、text向圖中添加文本 mu, sigma 100, 15 x mu sigma * np.random.randn(10000)# the histogram of the data n, bins, patches plt.hist(x, 50, densityTrue, facecolorg, alpha0.75)plt.xlabel(Smarts) plt.ylabel(Probability) plt.title(Histo…

Qt讀取ini格式配置文件的類設計

目錄 1.引言 2.QSettings 2.1.功能特點 2.2.基本用法 3.讀取ini文件配置通用類設計 3.1.設計要點 3.2.完整實現 3.3.調用方法 4.總結 1.引言 在編寫應用程序的時&#xff0c;有些參數需要用戶配置&#xff0c;那么這些參數就涉及到存儲了&#xff0c;單從存儲來講&…

git 還原被刪除的分支

在多人項目開發中&#xff0c;有一次碰到忘記合并到master分支了&#xff0c;直接就把開發分支給刪除了&#xff0c;現在記錄下怎么還原被刪除的分支 必須保證刪除的分支之前已經被推送到了遠程倉庫 # 找出被刪除分支的最后一個提交的哈希值 git reflog show# 找到提交哈希值…

2024/07/04

1、梳理筆記(原創) 2、終端輸入一個日期&#xff0c;判斷是這一年的第幾天 scanf("%d-%d-%d",&y,&m,&d); 閏年2月29天&#xff0c;平年2月28天 #include<stdio.h> int main(int argc, char const *argv[]) {int y0,m0,d0;printf("please ente…

析構函數和拷貝構造函數

文章目錄 析構函數1.析構函數的定義&#xff1a;2.析構函數的語法&#xff1a;3.析構函數的特性&#xff1a; 拷貝構造函數1.拷貝構造函數的定義&#xff1a;2.拷貝構造函數的語法3.拷貝構造函數的特性(1)拷貝構造函數是構造函數的一個重載形式**(這個其實也很好理解&#xff0…

鴻蒙開發設備管理:【@ohos.thermal (熱管理)】

熱管理 該模塊提供熱管理相關的接口&#xff0c;包括熱檔位查詢及注冊回調等功能。 說明&#xff1a; 本模塊首批接口從API version 8開始支持。后續版本的新增接口&#xff0c;采用上角標單獨標記接口的起始版本。開發前請熟悉鴻蒙開發指導文檔&#xff1a;gitee.com/li-shi…

如何實現圖片垂直旋轉90度的問題

非常簡單的問題&#xff0c;一串代碼就可以解決。復制修改一下就可以直接使用&#xff0c;一個簡單的小demo。寫項目的時候需要寫的功能&#xff0c;不到二十行代碼就可以實現。 <html> <head><title>旋轉圖片</title><meta http-equiv"Conte…

Land survey boundary report (template)

Land survey boundary report (template) 土地勘測定界報告&#xff08;模板&#xff09;.doc