代碼隨想錄二刷 | 鏈表 |環形鏈表II

代碼隨想錄二刷 | 鏈表 |環形鏈表II

  • 題目描述
  • 解題思路 & 代碼實現
    • 判斷鏈表是否有環
    • 如何找到環的入口

題目描述

142.環形鏈表II

給定一個鏈表的頭節點 head ,返回鏈表開始入環的第一個節點。 如果鏈表無環,則返回 null。

如果鏈表中有某個節點,可以通過連續跟蹤 next 指針再次到達,則鏈表中存在環。 為了表示給定鏈表中的環,評測系統內部使用整數 pos 來表示鏈表尾連接到鏈表中的位置(索引從 0 開始)。如果 pos 是 -1,則在該鏈表中沒有環。注意:pos 不作為參數進行傳遞,僅僅是為了標識鏈表的實際情況。

不允許修改 鏈表。

示例 1:

輸入:head = [3,2,0,-4], pos = 1
輸出:返回索引為 1 的鏈表節點
解釋:鏈表中有一個環,其尾部連接到第二個節點。

示例 2:

輸入:head = [1,2], pos = 0
輸出:返回索引為 0 的鏈表節點
解釋:鏈表中有一個環,其尾部連接到第一個節點。

示例 3:

輸入:head = [1], pos = -1
輸出:返回 null
解釋:鏈表中沒有環。

提示:

鏈表中節點的數目范圍在范圍 [0, 104] 內
-105 <= Node.val <= 105
pos 的值為 -1 或者鏈表中的一個有效索引

進階:你是否可以使用 O(1) 空間解決此題?

解題思路 & 代碼實現

本題主要解決兩個問題:

  • 判斷鏈表是否有環
  • 如果有環如何找到環的入口

判斷鏈表是否有環

使用快慢指針法,分別定義fastslow兩個指針,從頭節點出發,fast指針每次移動兩個節點,slow指針每次移動一個節點,如果兩個指針在途中相遇,說明這個鏈表有環。

強調途中的意思是指兩個指針不是在鏈表末尾相遇的。

因為fast指針移動的快,所以如果兩個指針相遇,一定是fast追上了slow指針,并且一定是在環中相遇,因為假如不在環中相遇,fast是無法從slow的后面追上slow的。

至于fast為什么走兩步,slow為什么走一步,是因為如果存在環,fast相當于是一步一步的追趕slow,也可以想象為slow沒有動,fast一次走一步,這樣就比較好理解了。

之所以slow也要移動,是因為最終要找的是環的入口,slow如果不移動,環的入口就比較難判斷。

如何找到環的入口

假設從頭結點到環形入口節點的節點數為x。 環形入口節點到 fast指針與slow指針相遇節點節點數為y。 從相遇節點再到環形入口節點節點數為z。 如圖所示:

在這里插入圖片描述
相遇時,slow指針走過的路程為x + y,fast針走過的路程為x + y + n * (y + z)n表示fast指針在環內走了 n 圈才遇到slow指針。

因為fast指針的速度是slow指針的兩倍,fast指針走的路程是slow指針走的路程的兩倍:

x + y + n * (y + z) = 2 * (x + y)

因為要求的是環形入口節點的位置,因此把 x 放在等式左邊:

x = n * (y + z) - y

再從其中提取出一個 y + z來:

x = (n - 1) (y + z) + z

n = 1時,也就是fast指針只走了一圈時,公式可化簡為x = z,這表示如果從頭節點出發一個指針,從相遇節點也出發一個指針,這兩個指針每次只走一個節點, 那么當這兩個指針相遇的時候,那個相遇的節點就是環形入口節點。

n > 1的時候,由于y + z就是環的長度,這表示fast指針在圈內走了一些圈數,最終還是能得出n = 1時的結論。

class Solution{
public:ListNode* detectCycle(ListNode* head){ListNode* fast = head;ListNode* slow = head;while (fast != NULL && fast -> next != NULL) {slow = slow -> next; // slow移動一步fast = fast -> next -> next; // fast移動兩步if (slow == fast) { // 當 fast 和 slow 相遇時ListNode* curA = head;ListNode* curB = fast;while (curA != curB) {curA = curA -> next;curB = curB -> next;}return curA; // 找到入口節點}}return NULL:}
};

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

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

相關文章

想發EI國際學術會議,但學校要求知網,這種情況該如何解決?

#學術發表# #國際會議# #知網要求# 近期后臺有私信想把論文發表在EI國際會議上&#xff0c;但是畢業要求又規定必須在知網上發表。看起來處境比較困難&#xff0c;作為一名師兄&#xff0c;我來分享下我的建議。 先要明確知網和EI國際會議的不同和各自的優劣&#xff1a; 知…

圖神經網絡:消息傳遞算法

一、說明 圖網絡-GNN&#xff08;Graph Neural Networks&#xff09;是近幾年研究的主題之一&#xff0c;雖不及深度神經網絡那么火爆&#xff0c;但在一些領域&#xff0c;如分子化學方面是不得不依賴的理論。本文就一些典型意義的圖神經網絡消息傳遞展開闡述。 二、圖網絡簡述…

Vue 3 渲染機制解密:從模板到頁面的魔法

Vue 3 渲染機制解密 前言Vue 3的響應性系統1. **Reactivity API:**2. **Proxy 對象:**3. **Getter 和 Setter:**4. **依賴追蹤:**5. **批量更新:**6. **異步更新:**7. **遞歸追蹤:**8. **刪除屬性:** 虛擬DOM的角色1. **減少直接操作真實 DOM:**2. **高效的批量更新:**3. **跨平…

【java】想要限制每次查詢的結果集不能超過10000行,該如何實現?

文章目錄 前言 前言 對于一些Saas化軟件&#xff0c;當某個租戶在執行查詢SQL時&#xff0c;如果查詢條件出現了BUG&#xff0c;導致去查了所有租戶的數據&#xff0c;這種情況是非常嚴重的&#xff0c;此時就需要在架構層面做限制&#xff0c;禁止一些特殊SQL的執行&#xff…

@PropertySource適配通配符加載到Environment的一種方案

PropertySource可將配置文件加載到內存&#xff0c;時間有限說干的&#xff0c;PropertySource注解有4個參數&#xff0c;其中value表示要加載文件的路徑&#xff0c;這個參數不支持通配符。還有一個參數PropertySourceFactory是加載配置文件的工廠&#xff0c;這兩個參數配合使…

【GUI】-- 13 貪吃蛇小游戲之食物及成績判斷

GUI編程 04 貪吃蛇小游戲 4.4 第四步&#xff1a;食物及成績判斷 首先&#xff0c;添加食物與分數的數據定義&#xff1a; //食物的坐標int foodX;int foodY;Random random new Random();//積分面板數據結構int score;在初始化方法中&#xff0c;添加(畫出)食物與分數&…

CSDN最新最全pytest系列——pytest-base-url插件之配置可選的項目系統UR

前言 ①當我們的自動化代碼完成之后&#xff0c;通常期望可以在不同的環境進行測試&#xff0c;此時可以將項目系統的URL單獨拿出來&#xff0c;并且可以通過pytest.ini配置文件和支持pytest命令行方式執行。 ② pytest-base-url 是一個簡單的pytest插件&#xff0c;它通過命…

紐扣電池上架TEMU、亞馬遜美國站需要做什么認證?紐扣電池認證標準16CFR1700.15,16CFR1700.20

近日&#xff0c;Temu連發多條賣家彈窗內容均為商品質量事故違規處理通告。其中一條為賣家銷售的車載吸塵器發生燒毀、冒煙等情況&#xff0c;產生用戶人傷、財損等輿情。經查實是商家偷換關鍵部件鋰電池&#xff0c;導致商品質量下降造成事故。TEMU對于問題車載吸塵器處理結果…

opencv 存儲bgr格式/同理可類推yuv

需求背景 開發rk3588 音視頻硬件編解碼&#xff0c;然后看見他的輸入文件格式。。 只能是裸的文件。不能是壓縮過的。就是不能是jpg/png這種格式&#xff0c;只能是以下的圖像/視頻 的存儲格式.那么我沒有這個格式的&#xff0c;以前hi3559的bgr格式和他要的也不太一致&#x…

設計循環隊列,解決假溢出問題

什么是假溢出&#xff1f; 當我們使用隊列這種基本的數據結構時&#xff0c;很容易發現&#xff0c;隨著入隊和出隊操作的不斷進行&#xff0c;隊列的數據區域不斷地偏向隊尾方向移動。當我們的隊尾指針指向了隊列之外的區域時&#xff0c;我們就不能再進行入隊操作了&#xff…

單鏈表在線OJ題二(詳解+圖解)

1.在一個排序的鏈表中&#xff0c;存在重復的結點&#xff0c;請刪除該鏈表中重復的結點&#xff0c;重復的結點不保留&#xff0c;返回鏈表頭指針 本題的意思是要刪除鏈表中重復出現的節點&#xff0c;然后返回刪除重復節點后的鏈表。 我們可以直接用一個哨兵位以便于觀察鏈表…

【GIT】代碼倉庫服務器變更本地修改并推送

author: jwensh date: 20231122 問題背景 沒有使用域名的 gitlb 服務器搬移&#xff08;IP地址變了&#xff09;&#xff0c; 以至于 gitlab 管理的項目無法進行連接及推送。因為涉及到多個項目工程&#xff0c;所以可以用本地配置修改的方式來進行重新關聯&#xff08;這種修…

指針變量和地址

A.指針變量和地址 理解了內存和地址的關系&#xff0c;我們再回到C語?&#xff0c;在C語?中創建變量其實就是向內存申請空間&#xff0c;比如&#xff1a; #include <stdio.h> int main() {int a 10;return 0; } ?如&#xff0c;上述的代碼就是創建了整型變量a&…

spring-boot-admin-starter-server監控springboot項目

文章目錄 場景實現具體操作展示 場景 監控三件套Prometheus、Grafana、Alertmanager 部署起來太復雜,如果公司沒有運維而且項目很小就可以使用spring-boot-admin-starter-server替代。這個包使用起來還是很簡單的, 下面就實現一個對springCloud項目的監控 實現 參考 項目 具體操…

算法通關村第十二關|青銅|字符串轉換整數

1.轉換成小寫字母 原題&#xff1a;力扣709. 字符串大寫轉小寫有現成的API使用&#xff0c;但是我們也可以自己來實現。 使用或運算進行加操作能提高效率&#xff0c;因為 32 對應的二進制表示為 00100000 &#xff0c;而大寫字母的范圍 [65, 90] 的二進制表示在 00100000 的…

經典中的經典之字符串

前言&#xff1a;前段時間發燒了&#xff0c;所以耽誤了很多事情&#xff0c;一直沒有更新&#xff0c;多穿點衣服&#xff0c;感冒不好受。 接下來有時間就會陸續更新一些基礎的算法題&#xff0c;題目都很經典&#xff0c;大家可以先嘗試著做&#xff0c;再看 解析。 第一…

Windows常用cmd網絡命令詳解

中午好&#xff0c;我的網工朋友。 上回給你們梳理了一些有趣的cmd命令&#xff0c;很多朋友希望再拓展一下&#xff0c;這不就來了&#xff1f; 今天從windows切入&#xff0c;給你分享一些常用cmd網絡命令&#xff0c;如果能熟悉上手&#xff0c;很多功能都可以快速實現&am…

Java Class 類文件格式看這一篇就夠了

本文將揭開Java Class文件的神秘面紗&#xff0c;帶你了解Class文件的內部結構&#xff0c;并從Class文件結構的視角告訴你&#xff1a; 為什么Java Class字節碼文件可以“寫一次&#xff0c;遍地跑”&#xff1f;為什么常量池的計數從1開始&#xff0c;而不是和java等絕大多數…

封裝Redis工具類

基于StringRedisTemplate封裝一個緩存工具類&#xff0c;滿足下列需求&#xff1a; 方法1&#xff1a;將任意Java對象序列化為json并存儲在string類型的key中&#xff0c;并且可以設置TTL過期時間 方法2&#xff1a;將任意Java對象序列化為json并存儲在string類型的key中&…

【JVM精講與GC調優教程(概述)】

如何理解虛擬機(JVM)跨語言的平臺 java虛擬機根本不關心運行在其內部的程序到底是使用何種編程語言編寫的,他只關心“字節碼”文件。 java不是最強大的語言,但是JVN是最強大的虛擬機。 不存在內存溢出? 內存泄露? JAVA = (C++)–; 垃圾回收機制為我們打理了很多繁瑣的…