国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

看完這篇文章你就徹底懂啦{保姆級講解}-----(LeetCode刷題142環(huán)形鏈表II) 2023.4.24

這篇具有很好參考價值的文章主要介紹了看完這篇文章你就徹底懂啦{保姆級講解}-----(LeetCode刷題142環(huán)形鏈表II) 2023.4.24。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

前言

本文章一部分內(nèi)容參考于《代碼隨想錄》----如有侵權(quán)請聯(lián)系作者刪除即可,撰寫本文章主要目的在于記錄自己學(xué)習(xí)體會并分享給大家,全篇并不僅僅是復(fù)制粘貼,更多的是加入了自己的思考,希望讀完此篇文章能真正幫助到您?。?!

算法題(LeetCode刷題142環(huán)形鏈表II)—(保姆級別講解)

力扣題目鏈接

看完這篇文章你就徹底懂啦{保姆級講解}-----(LeetCode刷題142環(huán)形鏈表II) 2023.4.24看完這篇文章你就徹底懂啦{保姆級講解}-----(LeetCode刷題142環(huán)形鏈表II) 2023.4.24看完這篇文章你就徹底懂啦{保姆級講解}-----(LeetCode刷題142環(huán)形鏈表II) 2023.4.24

分析題目:

  1. 其實(shí)本題目中主要解決兩個問題,分別是:
  1. 判斷鏈表是否有環(huán)
  2. 如果有環(huán),如何找到這個環(huán)的入口。

算法思想

  1. 判斷鏈表是否有環(huán)

可以使用快慢指針法,分別定義 fastslow 指針,從頭結(jié)點(diǎn)出發(fā),fast指針每次移動兩個節(jié)點(diǎn),slow指針每次移動一個節(jié)點(diǎn),如果 fastslow指針在途中相遇 ,說明這個鏈表有環(huán)。
為什么fast 走兩個節(jié)點(diǎn),slow走一個節(jié)點(diǎn),有環(huán)的話,一定會在環(huán)內(nèi)相遇呢,而不是永遠(yuǎn)的錯開呢
首先第一點(diǎn):fast指針一定先進(jìn)入環(huán)中,如果fast指針和slow指針相遇的話,一定是在環(huán)中相遇,這是毋庸置疑的。
那么來看一下,為什么fast指針slow指針一定會相遇呢?
可以畫一個環(huán),然后讓 fast指針在任意一個節(jié)點(diǎn)開始追趕slow指針。
會發(fā)現(xiàn)最終都是這種情況, 如下圖:
看完這篇文章你就徹底懂啦{保姆級講解}-----(LeetCode刷題142環(huán)形鏈表II) 2023.4.24

fastslow各自再走一步, fastslow就相遇了

這是因?yàn)?code>fast是走兩步,slow是走一步,其實(shí)相對于slow來說,fast是一個節(jié)點(diǎn)一個節(jié)點(diǎn)的靠近slow的,所以fast一定可以和slow重合。

  1. 如果有環(huán),如何找到這個環(huán)的入口

此時已經(jīng)可以判斷鏈表是否有環(huán)了,那么接下來要找這個環(huán)的入口了。

假設(shè)從頭結(jié)點(diǎn)到環(huán)形入口節(jié)點(diǎn) 的節(jié)點(diǎn)數(shù)為x。 環(huán)形入口節(jié)點(diǎn)到 fast指針與slow指針相遇節(jié)點(diǎn) 節(jié)點(diǎn)數(shù)為y。 從相遇節(jié)點(diǎn) 再到環(huán)形入口節(jié)點(diǎn)節(jié)點(diǎn)數(shù)為 z。 如圖所示:

看完這篇文章你就徹底懂啦{保姆級講解}-----(LeetCode刷題142環(huán)形鏈表II) 2023.4.24

那么相遇時: slow指針走過的節(jié)點(diǎn)數(shù)為: x + yfast指針走過的節(jié)點(diǎn)數(shù):x + y + n (y + z),nfast指針在環(huán)內(nèi)走了n圈才遇到slow指針, (y+z)為 一圈內(nèi)節(jié)點(diǎn)的個數(shù)。

因?yàn)?code>fast指針是一步走兩個節(jié)點(diǎn),slow指針一步走一個節(jié)點(diǎn), 所以 fast指針走過的節(jié)點(diǎn)數(shù) = slow指針走過的節(jié)點(diǎn)數(shù) * 2

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

兩邊消掉一個(x+y): x + y = n (y + z)

因?yàn)橐噎h(huán)形的入口,那么要求的是x,因?yàn)?code>x表示 頭結(jié)點(diǎn)到 環(huán)形入口節(jié)點(diǎn)的的距離。

所以要求x ,將x單獨(dú)放在左面:x = n (y + z) - y ,

再從n(y+z)中提出一個 (y+z)來,整理公式之后為如下公式:x = (n - 1) (y + z) + z 注意這里n一定是大于等于1的,因?yàn)?fast指針至少要多走一圈才能相遇slow指針。

這個公式說明什么呢?

先拿n1的情況來舉例,意味著fast指針在環(huán)形里轉(zhuǎn)了一圈之后,就遇到了 slow指針了。

當(dāng) n為1的時候,公式就化解為 x = z,

這就意味著,從頭結(jié)點(diǎn)出發(fā)一個指針,從相遇節(jié)點(diǎn) 也出發(fā)一個指針,這兩個指針每次只走一個節(jié)點(diǎn), 那么當(dāng)這兩個指針相遇的時候就是 環(huán)形入口的節(jié)點(diǎn)。

也就是在相遇節(jié)點(diǎn)處,定義一個指針index1,在頭結(jié)點(diǎn)處定一個指針index2。

index1index2同時移動,每次移動一個節(jié)點(diǎn), 那么他們相遇的地方就是 環(huán)形入口的節(jié)點(diǎn)。

看完這篇文章你就徹底懂啦{保姆級講解}-----(LeetCode刷題142環(huán)形鏈表II) 2023.4.24

那么 n如果大于1是什么情況呢,就是fast指針在環(huán)形轉(zhuǎn)n圈之后才遇到 slow指針。

其實(shí)這種情況和n為1的時候 效果是一樣的,一樣可以通過這個方法找到 環(huán)形的入口節(jié)點(diǎn),只不過,index1 指針在環(huán)里 多轉(zhuǎn)了(n-1)圈,然后再遇到index2,相遇點(diǎn)依然是環(huán)形的入口節(jié)點(diǎn)。

環(huán)形鏈表II代碼:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        ListNode* fast = head;
        ListNode* slow = head;
        while(fast != NULL && fast->next != NULL) {
            slow = slow->next;
            fast = fast->next->next;
            // 快慢指針相遇,此時從head 和 相遇點(diǎn),同時查找直至相遇
            if (slow == fast) {
                ListNode* index1 = fast;
                ListNode* index2 = head;
                while (index1 != index2) {
                    index1 = index1->next;
                    index2 = index2->next;
                }
                return index2; // 返回環(huán)的入口
            }
        }
        return NULL;
    }
};

好!按照老樣子,接下來開始詳細(xì)講解每行代碼的用處,以及為什么這樣寫!

ListNode* fast = head;
ListNode* slow = head;

//設(shè)置兩個指針,分別是快指針和慢指針,并且同時指向頭節(jié)點(diǎn)。

while(fast != NULL && fast->next != NULL)

//這里判斷快指針,為什么不判斷慢指針呢?
因?yàn)?code>快指針一次移動為兩步,是慢指針兩倍,所以直接判斷快指針即可。
同時因?yàn)榭熘羔樢淮我苿訛閮刹?,所以在移動之前需要判?code>快指針的后兩個節(jié)點(diǎn)是否為空。

slow = slow->next;
fast = fast->next->next;

//開始移動快指針和慢指針

if (slow == fast)

//代表已經(jīng)證明有環(huán),也證明快指針和慢指針現(xiàn)在已經(jīng)相遇

ListNode* index1 = fast;
ListNode* index2 = head;

//既然快指針和慢指針現(xiàn)在已經(jīng)相遇,我們就開始尋找環(huán)的入口點(diǎn),即設(shè)置index1指向相遇點(diǎn)處,index2指向頭節(jié)點(diǎn)處。

 while (index1 != index2) {
	 index1 = index1->next;
	 index2 = index2->next;
}

//當(dāng)index1index2開始相遇的時候代表此時指向的是環(huán)的入口處。

 return NULL;

//如果沒有環(huán),則返回NULL

補(bǔ)充

在推理過程中,大家可能有一個疑問就是:為什么第一次在環(huán)中相遇,slow的 步數(shù) 是 x+y 而不是 x + 若干環(huán)的長度 + y 呢?

首先slow進(jìn)環(huán)的時候,fast一定是先進(jìn)環(huán)來了。

如果slow進(jìn)環(huán)入口,fast也在環(huán)入口,那么把這個環(huán)展開成直線,就是如下圖的樣子:

看完這篇文章你就徹底懂啦{保姆級講解}-----(LeetCode刷題142環(huán)形鏈表II) 2023.4.24

那又有一個問題,為什么fast不能跳過去呢? 在剛剛已經(jīng)說過一次了,fast相對于slow是一次移動一個節(jié)點(diǎn),所以不可能跳過去。

結(jié)束語

如果覺得這篇文章還不錯的話,記得點(diǎn)贊 ,支持下?。。?span toymoban-style="hidden">文章來源地址http://www.zghlxwxcb.cn/news/detail-453158.html

到了這里,關(guān)于看完這篇文章你就徹底懂啦{保姆級講解}-----(LeetCode刷題142環(huán)形鏈表II) 2023.4.24的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 看完這篇文章你就徹底懂啦{保姆級講解}-----(LeetCode刷題142環(huán)形鏈表II) 2023.4.24

    看完這篇文章你就徹底懂啦{保姆級講解}-----(LeetCode刷題142環(huán)形鏈表II) 2023.4.24

    本文章一部分內(nèi)容參考于《代碼隨想錄》----如有侵權(quán)請聯(lián)系作者刪除即可,撰寫本文章主要目的在于記錄自己學(xué)習(xí)體會并分享給大家,全篇并不僅僅是復(fù)制粘貼,更多的是加入了自己的思考,希望讀完此篇文章能真正幫助到您?。?! 力扣題目鏈接 分析題目: 其實(shí)本題目中主

    2024年02月05日
    瀏覽(17)
  • 看完這篇文章你就徹底懂啦{保姆級講解}-----(LeetCode刷題704、35、34數(shù)組二分查找) 2023.4.17

    看完這篇文章你就徹底懂啦{保姆級講解}-----(LeetCode刷題704、35、34數(shù)組二分查找) 2023.4.17

    本文章一部分內(nèi)容參考于《代碼隨想錄》----如有侵權(quán)請聯(lián)系作者刪除即可,撰寫本文章主要目的在于記錄自己學(xué)習(xí)體會并分享給大家,全篇并不僅僅是復(fù)制粘貼,更多的是加入了自己的思考,希望讀完此篇文章能真正幫助到您?。?! 數(shù)組是由n(n=1)個 相同類型 的數(shù)據(jù)元素

    2024年02月05日
    瀏覽(28)
  • 看完這篇文章你就徹底懂啦{保姆級講解}-----(LeetCode刷題203.707.206翻轉(zhuǎn)鏈表) 2023.4.21

    看完這篇文章你就徹底懂啦{保姆級講解}-----(LeetCode刷題203.707.206翻轉(zhuǎn)鏈表) 2023.4.21

    本文章一部分內(nèi)容參考于《代碼隨想錄》----如有侵權(quán)請聯(lián)系作者刪除即可,撰寫本文章主要目的在于記錄自己學(xué)習(xí)體會并分享給大家,全篇并不僅僅是復(fù)制粘貼,更多的是加入了自己的思考,希望讀完此篇文章能真正幫助到您?。?! 力扣題目鏈接 關(guān)于這個算法思想,我在之

    2024年02月04日
    瀏覽(27)
  • 看完這篇文章你就徹底懂啦{保姆級講解}-----(LeetCode刷題242有效的字母異位詞) 2023.4.25

    看完這篇文章你就徹底懂啦{保姆級講解}-----(LeetCode刷題242有效的字母異位詞) 2023.4.25

    本文章一部分內(nèi)容參考于《代碼隨想錄》----如有侵權(quán)請聯(lián)系作者刪除即可,撰寫本文章主要目的在于記錄自己學(xué)習(xí)體會并分享給大家,全篇并不僅僅是復(fù)制粘貼,更多的是加入了自己的思考,希望讀完此篇文章能真正幫助到您!?。?力扣題目鏈接 分析題目: 什么叫做字母異

    2024年02月06日
    瀏覽(29)
  • 看完這篇文章你就徹底懂啦{保姆級講解}-----(I.MX6U驅(qū)動UART串口通信) 2023.5.20

    看完這篇文章你就徹底懂啦{保姆級講解}-----(I.MX6U驅(qū)動UART串口通信) 2023.5.20

    串口是我們在開發(fā)過程中最常用到的外設(shè),所以我們必須掌握。 串口驅(qū)動初始化部分 好!按照老樣子,接下來開始詳細(xì)講解每行代碼的用處,以及為什么這樣寫! 串口驅(qū)動初始化部分講解開始: //將IO功能設(shè)置為UART1_RXD和UART1_TXD。 //配置UART1_TX_DATA、UART1_RX_DATA的IO屬性。 先關(guān)

    2024年02月05日
    瀏覽(22)
  • ai繪畫如何使用?看完這篇文章你就知道了

    ai繪畫如何使用?看完這篇文章你就知道了

    對于藝術(shù)家和創(chuàng)作者來說,AI繪畫可以作為一種實(shí)用的工具,提供靈感和創(chuàng)意的源泉。它可以分析和學(xué)習(xí)大量的藝術(shù)作品,從中汲取元素和風(fēng)格,并以獨(dú)特的方式重新組合和表達(dá)。這使得藝術(shù)家能夠更快速地探索和實(shí)驗(yàn)不同的藝術(shù)風(fēng)格,從而推動他們的創(chuàng)造力和藝術(shù)表達(dá)的邊

    2024年02月09日
    瀏覽(21)
  • ai繪畫生成方法有哪些?看完這篇文章你就知道了

    ai繪畫生成方法有哪些?看完這篇文章你就知道了

    近年來,隨著人工智能技術(shù)的不斷發(fā)展和普及,AI 繪畫作為一種新興的藝術(shù)創(chuàng)作方式也逐漸被人們所認(rèn)知。與傳統(tǒng)繪畫相比,AI 繪畫可以通過計(jì)算機(jī)算法自動生成,具有高效、便捷的特點(diǎn),同時也能夠更好地滿足一些特定場景的需求。 在過去,數(shù)字藝術(shù)家需要通過繪制、建模

    2024年02月15日
    瀏覽(31)
  • 怎么用ai繪畫二次元拍同款?看完這篇文章你就懂了

    怎么用ai繪畫二次元拍同款?看完這篇文章你就懂了

    在我們的二次元世界里,每一張優(yōu)質(zhì)的插圖都能夠引發(fā)無盡的想象和瞬間的心動。而現(xiàn)如今,隨著人工智能技術(shù)的飛速發(fā)展,ai繪畫已經(jīng)成為一個備受矚目的領(lǐng)域。在使用ai繪畫生成二次元作品時,ai繪畫二次元描述詞就顯得相當(dāng)重要。那么,究竟ai繪畫二次元描述詞怎么寫呢

    2024年02月16日
    瀏覽(25)
  • 中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式看完這一篇文章你就懂了

    一、什么是中綴表達(dá)式 二、什么是后綴表達(dá)式 三、后綴轉(zhuǎn)中綴具體思路 四、代碼實(shí)現(xiàn) 中綴表達(dá)式就是我們常用的算術(shù)表達(dá)方式,例如 (12+34)*5 ,運(yùn)算符在兩個數(shù)的中間,但是對于中綴表達(dá)式來說括號和加減乘除使得問題對于計(jì)算機(jī)非常復(fù)雜,為了有效的處理他們,波蘭邏輯

    2024年02月08日
    瀏覽(16)
  • 你真的學(xué)懂if語句了嘛,看完這篇文章你一定會讓你有所收獲,徹底玩轉(zhuǎn)if語句!

    你真的學(xué)懂if語句了嘛,看完這篇文章你一定會讓你有所收獲,徹底玩轉(zhuǎn)if語句!

    ?? 鴿芷咕 :個人主頁 ??? 個人專欄 :《C語言初階篇》 《C語言進(jìn)階篇》 ??生活的理想,就是為了理想的生活! ?? ?? hello! 各位寶子們大家好啊,相信大家都多多少少了解過if語句吧,但是你真的有了解過,所有if語句的細(xì)節(jié)嗎?學(xué)完這篇文章你將知道if語句的所有知識

    2024年02月11日
    瀏覽(42)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包