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

【數(shù)據(jù)結(jié)構(gòu)】鏈表經(jīng)典OJ題,常見幾類題型(二)

這篇具有很好參考價值的文章主要介紹了【數(shù)據(jù)結(jié)構(gòu)】鏈表經(jīng)典OJ題,常見幾類題型(二)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

題型三:鏈表相交,找相交節(jié)點

思路解析

看到這類題型首先要判斷鏈表是否相交,而相交條件:兩鏈尾部節(jié)點相同(地址相同,val值相同,next相同)。這樣我們便可找到兩鏈表的尾節(jié)點并判斷這兩個節(jié)點地址是否相同,若相同則兩鏈表相交。上面這種情況兩鏈表呈'Y'型,那么我們想一下兩鏈表相交是否可以呈'X'型呢?
【數(shù)據(jù)結(jié)構(gòu)】鏈表經(jīng)典OJ題,常見幾類題型(二),數(shù)據(jù)結(jié)構(gòu)和算法,數(shù)據(jù)結(jié)構(gòu),鏈表
如上圖所示如果兩鏈表相交呈'X'型的話,相交節(jié)點的next就會指向兩個節(jié)點,這并不符合單鏈表的定義。
那么在判斷了相交鏈表后,如何找到相交節(jié)點呢?在我們找尾節(jié)點時,我們可以順便計算兩鏈表的長度,定義兩鏈表指針slowfast分別指向鏈表頭節(jié)點,讓指向長鏈表的指針先走兩鏈表長度的差值,然后一起向后走,當(dāng)slow == fast時就找到了相交節(jié)點。

OJ題實例

LeetCode鏈接: 160. 相交鏈表

解題代碼

//方法一的解法
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB)
{
    struct ListNode* cur1 = headA, *cur2 = headB;
    int len1 = 1, len2 = 1;
    //找尾節(jié)點,并計算鏈表長度
    while(cur1 -> next)
    {
        cur1 = cur1->next;
        len1++;
    }
    while(cur2 -> next)
    {
        cur2 = cur2->next;
        len2++;
    }
    if(cur1 != cur2)
        return NULL;
    //計算鏈表長度差值
    int count = abs(len1 - len2);
    struct ListNode* slow=headA, *fast=headB;
    if(len1 > len2)
    {
        fast = headA;
        slow = headB;
    }
    //找相交節(jié)點
    while(count--)
        fast = fast->next;
    while(slow != fast)
    {
        slow = slow->next;
        fast = fast->next;
    }
    return slow;
}

題型四:鏈表帶環(huán),找入環(huán)節(jié)點

思路解析

解決這題我們還是要先定義快慢指針slow,fast,即當(dāng)slow向后走一步,fast向后走兩步。我們便可寫一個結(jié)束條件為fast && fast->next的循環(huán)。因為如果此鏈表不帶環(huán),那么指針遲早會走到NULL;如果鏈表帶環(huán),那么便沒有空節(jié)點,此循環(huán)便不會結(jié)束。這時我們只需要在slow == fast時結(jié)束循環(huán),因為只有環(huán)形結(jié)構(gòu)slow才能追上fast,則鏈表帶環(huán)且這點在環(huán)內(nèi)為相遇點。
對于找入環(huán)的第一個節(jié)點,我們可以先假設(shè)C環(huán)長L環(huán)外面部分長,X入環(huán)點到相遇節(jié)點的長,n為兩指針相遇時fastslow多走的圈數(shù),此處長皆為節(jié)點數(shù),那么我們便可得到如下圖所示的結(jié)構(gòu)圖:
【數(shù)據(jù)結(jié)構(gòu)】鏈表經(jīng)典OJ題,常見幾類題型(二),數(shù)據(jù)結(jié)構(gòu)和算法,數(shù)據(jù)結(jié)構(gòu),鏈表
接下來我將以兩種方法解決此問題:

方法一:
我們可以想到當(dāng)兩節(jié)點相遇時,慢指針slow走過了L + X的距離,快指針fast走過了L + nC + X距離,又因為快指針的速度是慢指針的2倍,于是我們得到了一個數(shù)學(xué)公式,即:2(L + X) = L + nC + X,經(jīng)過化簡最后得到L = nC - X。此時我們可以定義兩個結(jié)構(gòu)體指針head,meet讓他們分別從鏈表頭節(jié)點和相遇節(jié)點向后走,根據(jù)此公式他們會在入環(huán)的第一節(jié)點相遇,于是就找到了入環(huán)第一個節(jié)點。

方法二:
我們可以在相遇點處將鏈表切斷,然后經(jīng)過反轉(zhuǎn)鏈表的到'Y',于是乎這題就轉(zhuǎn)變?yōu)榱祟}型三的類型,即相交鏈表找第一個相交節(jié)點,如下所示:
【數(shù)據(jù)結(jié)構(gòu)】鏈表經(jīng)典OJ題,常見幾類題型(二),數(shù)據(jù)結(jié)構(gòu)和算法,數(shù)據(jù)結(jié)構(gòu),鏈表
兩點需要注意:

  1. 如圖中1處,我們是將L + X的部分反轉(zhuǎn);
  2. 如圖中2處,最后需要將指向原頭位置的指針指向NULL。

OJ實例

LeetCode鏈接: 142. 環(huán)形鏈表 II文章來源地址http://www.zghlxwxcb.cn/news/detail-752969.html

解題代碼

//基于方法一的解法:
struct ListNode *detectCycle(struct ListNode *head)
{
   struct ListNode* slow = head, *fast = head;
   //判斷fast和slow相遇的地方
   while(fast && fast->next)
   {
       slow = slow->next;
       fast = fast->next->next;
       if(fast == slow)
           break;
   }
   if(fast == NULL || fast -> next == NULL)
       return NULL;
    struct ListNode* meet = slow;
    //2(L+X) = L+nC+X
    //L+X=nC(C為環(huán)長,L為環(huán)外面部分長,X為進環(huán)點到相遇點的距離)
    while(meet != head)
    {
        meet = meet->next;
        head = head->next;
    }
    return meet;
}

到了這里,關(guān)于【數(shù)據(jù)結(jié)構(gòu)】鏈表經(jīng)典OJ題,常見幾類題型(二)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 數(shù)據(jù)結(jié)構(gòu)——鏈表OJ題

    數(shù)據(jù)結(jié)構(gòu)——鏈表OJ題

    目錄 ? 1.給你一個鏈表的頭節(jié)點?head?和一個整數(shù)?val?,請你刪除鏈表中所有滿足?Node.val == val?的節(jié)點,并返回?新的頭節(jié)點?。 2.給定一個帶有頭結(jié)點 head 的非空單鏈表,返回鏈表的中間結(jié)點。如果有兩個中間結(jié)點,則返回第二個中間結(jié)點。 3.變形題:找到鏈表中倒數(shù)第k個

    2024年02月21日
    瀏覽(22)
  • 二叉樹經(jīng)典OJ題——【數(shù)據(jù)結(jié)構(gòu)】

    二叉樹經(jīng)典OJ題——【數(shù)據(jù)結(jié)構(gòu)】

    W...Y的主頁 ??? 代碼倉庫分享 ??? 今天我們來進行二叉樹的OJ練習(xí),就是利用二叉樹的前序、中序、后續(xù)以及晨序遍歷的特性進行OJ訓(xùn)練。話不多說,來看我們的第一道題。 【leetcode 965.單值二叉樹】 OJ鏈接? 如果二叉樹每個節(jié)點都具有相同的值,那么該二叉樹就是 單值 二

    2024年02月07日
    瀏覽(22)
  • 【數(shù)據(jù)結(jié)構(gòu)】棧與隊列經(jīng)典oj題

    【數(shù)據(jù)結(jié)構(gòu)】棧與隊列經(jīng)典oj題

    ??write in front?? ??所屬專欄:初階數(shù)據(jù)結(jié)構(gòu) ???博客主頁:睿睿的博客主頁 ???代碼倉庫:??VS2022_C語言倉庫 ??您的點贊、關(guān)注、收藏、評論,是對我最大的激勵和支持?。?! 關(guān)注我,關(guān)注我,關(guān)注我 , 你們將會看到更多的優(yōu)質(zhì)內(nèi)容?。???棧兩種線性表示都能實現(xiàn)

    2024年02月03日
    瀏覽(17)
  • 【數(shù)據(jù)結(jié)構(gòu)初階】鏈表OJ

    【數(shù)據(jù)結(jié)構(gòu)初階】鏈表OJ

    OJ 方案一: 題目解析: 方案二: 題目解析:把原鏈表遍歷一遍,插入新鏈表 OJ 題目解析: OJ 題目解析: OJ 題目解析: OJ 題目解析: OJ 題目解析: OJ 題目解析: OJ 題目解析: 定義快慢指針,使快指針先走與慢指針同步。然后同時走看是否相交 OJ 題目解析: OJ 題目解析:

    2024年02月05日
    瀏覽(94)
  • 【數(shù)據(jù)結(jié)構(gòu)OJ題】環(huán)形鏈表

    【數(shù)據(jù)結(jié)構(gòu)OJ題】環(huán)形鏈表

    原題鏈接:https://leetcode.cn/problems/linked-list-cycle/description/ 目錄 1. 題目描述 2. 思路分析 3. 代碼實現(xiàn) 整體思路: 定義 快慢指針fast,slow ,如果 鏈表確實有環(huán) , fast指針一定會在環(huán)內(nèi)追上slow指針。 即慢指針一次走一步,快指針一次走兩步,兩個指針從鏈表起始位置開始運行,

    2024年02月12日
    瀏覽(22)
  • 【數(shù)據(jù)結(jié)構(gòu)OJ題】鏈表分割

    【數(shù)據(jù)結(jié)構(gòu)OJ題】鏈表分割

    原題鏈接:https://www.nowcoder.com/practice/0e27e0b064de4eacac178676ef9c9d70?tpId=8tqId=11004rp=2ru=/activity/ojqru=/ta/cracking-the-coding-interview/question-ranking 目錄 1. 題目描述 2. 思路分析 3. 代碼實現(xiàn) 整體思路: 創(chuàng)建兩個鏈表 ,分別存放 小于x的結(jié)點 和 大于等于x的結(jié)點 , 分別進行尾插 。 這道題目使

    2024年02月12日
    瀏覽(16)
  • 數(shù)據(jù)結(jié)構(gòu)——圖解鏈表OJ題目

    數(shù)據(jù)結(jié)構(gòu)——圖解鏈表OJ題目

    ? ? ? ? 學(xué)完了單鏈表之后,我們對其基本結(jié)構(gòu)已經(jīng)有了一定的了解,接下來我們通過一些題目強化對鏈表的理解,同時學(xué)習(xí)一些面試筆試題目的新思路以及加強對數(shù)據(jù)結(jié)構(gòu)單鏈表的掌握。? 目錄 題目一.876. 鏈表的中間結(jié)點 - 力扣(LeetCode) 題目二:21. 合并兩個有序鏈表

    2024年02月04日
    瀏覽(20)
  • 【數(shù)據(jù)結(jié)構(gòu)】反轉(zhuǎn)鏈表、鏈表的中間節(jié)點、鏈表的回文結(jié)構(gòu)(單鏈表OJ題)

    【數(shù)據(jù)結(jié)構(gòu)】反轉(zhuǎn)鏈表、鏈表的中間節(jié)點、鏈表的回文結(jié)構(gòu)(單鏈表OJ題)

    正如標(biāo)題所說,本文會圖文詳細(xì)解析三道單鏈表OJ題,分別為: ?反轉(zhuǎn)鏈表 (簡單) ?鏈表的中間節(jié)點 (簡單) ?鏈表的回文結(jié)構(gòu) (較難) 把他們放在一起講的原因是: ?反轉(zhuǎn)鏈表 和 ?鏈表的中間節(jié)點 是 ?鏈表的回文結(jié)構(gòu) 的基礎(chǔ) 為什么這樣說?請往下看: 目錄 1. 反轉(zhuǎn)鏈

    2024年02月13日
    瀏覽(104)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】手撕鏈表OJ題

    【數(shù)據(jù)結(jié)構(gòu)與算法】手撕鏈表OJ題

    給你一個鏈表的頭節(jié)點 head 和一個整數(shù) val ,請你刪除鏈表中所有滿足 Node.val == val 的節(jié)點,并返回 新的頭節(jié)點 思路一 :一種比較普遍的方式,邊遍歷邊找不同。我們可以通過定義兩個指針,一個指向頭節(jié)點,一個置為NULL。當(dāng)遇到值為相同的時候,直接跳過去。指向下一位

    2024年02月10日
    瀏覽(19)
  • 【數(shù)據(jù)結(jié)構(gòu)OJ題】環(huán)形鏈表II

    【數(shù)據(jù)結(jié)構(gòu)OJ題】環(huán)形鏈表II

    原題鏈接:https://leetcode.cn/problems/linked-list-cycle-ii/description/ 如果有小伙伴不了解環(huán)形鏈表,可以先看看這篇文章: https://blog.csdn.net/m0_62531913/article/details/132352203?spm=1001.2014.3001.5502 我們來看下圖: ?我們根據(jù)這個結(jié)論就可以做出這道題目了!

    2024年02月12日
    瀏覽(19)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包