鏈表求交

求兩個(gè)鏈表是否有交點(diǎn)和交點(diǎn)位置油猫。
先判斷是否有環(huán)。如果兩者一個(gè)有一個(gè)沒(méi)有柠偶,一定沒(méi)有交點(diǎn)情妖。

兩者無(wú)環(huán)

思路很簡(jiǎn)單:先求兩者長(zhǎng)度,然后較大者先從頭指針出走m步诱担,m是兩者長(zhǎng)度差值毡证。然后兩指針同時(shí)開(kāi)始走,如果兩者有交蔫仙,則兩指針一定會(huì)在某一點(diǎn)相遇料睛。如果不是,則兩指針在都為空之前均不相等。


CODE
    bool chkIntersect(ListNode* headA, ListNode* headB) {
        if(!headA || !headB)
            return false;
        int len1=ListLen(headA);
        int len2=ListLen(headB);
        if(len1>len2){
            for(int i=0;i<len1-len2;i++){
                headA=headA->next;
            }
        }else{
            for(int i=0;i<len2-len1;i++){
                headB=headB->next;
            }
        }
        while(headA){
            if(headA==headB)
                return true;
            headA=headA->next;
            headB=headB->next;
        }
        return false;
    }

兩者有環(huán)

如果兩者有環(huán)秦效,那么交點(diǎn)可能在入環(huán)前雏蛮,或入環(huán)后涎嚼。

  1. 找到兩者入環(huán)結(jié)點(diǎn)阱州,如果相等,則交點(diǎn)在入環(huán)前法梯。使用“兩者無(wú)環(huán)”情況的思路苔货,以入環(huán)結(jié)點(diǎn)為尾結(jié)點(diǎn),求出兩鏈表長(zhǎng)度立哑,然后錯(cuò)位遍歷夜惭。


  2. 如果兩入環(huán)結(jié)點(diǎn)不相等:
    這種情況下,可能是無(wú)交铛绰,或者交點(diǎn)在環(huán)內(nèi)诈茧。方法是其中一個(gè)入環(huán)結(jié)點(diǎn)(比如node2)沿著所在環(huán)遍歷一遍回到原來(lái)位置,如果node1也在環(huán)內(nèi)捂掰,兩者就會(huì)相遇敢会。反之,兩者就是無(wú)交这嚣。


CODE

函數(shù)1:判斷是否有環(huán)鸥昏,返回入環(huán)結(jié)點(diǎn)
    ListNode* chkLoop(ListNode* head) {
        if(!head || !head->next)
            return nullptr;
        ListNode* H=new ListNode(0);
        H->next=head;
        ListNode *fast=H,*slow=H;
        while(fast->next && fast->next->next){
            fast=fast->next->next;
            slow=slow->next;
            if(fast==slow){
                break;
            }
        }
        if(fast!=slow)
            return nullptr;
        slow=H;
        while(fast!=slow){
            fast=fast->next;
            slow=slow->next;
        }
        delete H;
        return fast;
    }
函數(shù)2:求鏈表的長(zhǎng)度,截止于參數(shù)2之前的位置
    int ListLen(ListNode* h,ListNode* tnext){
        int len=0;
        while(h!=tnext){
            len++;
            h=h->next;
        }
        return len;
    }

這樣的話姐帚,當(dāng)tnext==NULL時(shí)就是求整個(gè)鏈表的長(zhǎng)度吏垮。

函數(shù)3:已知兩個(gè)鏈表均以tnext做尾后,求是否相交
    ListNode* rLinkJoint(ListNode* headA, ListNode* headB,ListNode* tnext) {
        if(!headA || !headB)
            return nullptr;
        int len1=ListLen(headA,tnext);
        int len2=ListLen(headB,tnext);
        
        if(len1>len2){
            for(int i=0;i<len1-len2;i++){
                headA=headA->next;
            }
        }else{
            for(int i=0;i<len2-len1;i++){
                headB=headB->next;
            }
        }
        while(headA!=tnext){
            if(headA==headB)
                return headA;
            headA=headA->next;
            headB=headB->next;
        }
        return nullptr;
    }

這樣的話罐旗,當(dāng)tnext==NULL時(shí)就是正常無(wú)環(huán)鏈表的情況膳汪。

函數(shù)4:判斷情況以及交點(diǎn)在入環(huán)部分的代碼
    bool chkInter(ListNode* head1, ListNode* head2, int adjust0, int adjust1) {
        ListNode *join1=chkLoop(head1),*join2=chkLoop(head2);
        if(!join1 && !join2){
            return rLinkJoint(head1, head2,nullptr);
        }else if(join1 && join2){
            if(join1==join2){
                return rLinkJoint(head1, head2,join1->next);
            }else{
                ListNode *p=join1;
                do{
                    if(p==join2)
                     return true;
                    p=p->next;
                }while(p!=join1);
                return false;
            }
        }else
            return false;
    }
思考

鏈表以NULL做尾后,我們也可以自己知道尾后參數(shù)九秀,來(lái)增加函數(shù)的

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末旅敷,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子颤霎,更是在濱河造成了極大的恐慌媳谁,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件友酱,死亡現(xiàn)場(chǎng)離奇詭異晴音,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)缔杉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)锤躁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人或详,你說(shuō)我怎么就攤上這事系羞」疲” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵椒振,是天一觀的道長(zhǎng)昭伸。 經(jīng)常有香客問(wèn)我,道長(zhǎng)澎迎,這世上最難降的妖魔是什么庐杨? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮夹供,結(jié)果婚禮上灵份,老公的妹妹穿的比我還像新娘。我一直安慰自己哮洽,他們只是感情好填渠,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著鸟辅,像睡著了一般氛什。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上剔桨,一...
    開(kāi)封第一講書(shū)人閱讀 49,031評(píng)論 1 285
  • 那天屉更,我揣著相機(jī)與錄音,去河邊找鬼洒缀。 笑死瑰谜,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的树绩。 我是一名探鬼主播萨脑,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼饺饭!你這毒婦竟也來(lái)了渤早?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤瘫俊,失蹤者是張志新(化名)和其女友劉穎鹊杖,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體扛芽,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡骂蓖,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了川尖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片登下。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出被芳,到底是詐尸還是另有隱情缰贝,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布畔濒,位于F島的核電站剩晴,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏篓冲。R本人自食惡果不足惜李破,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一宠哄、第九天 我趴在偏房一處隱蔽的房頂上張望壹将。 院中可真熱鬧,春花似錦毛嫉、人聲如沸诽俯。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)暴区。三九已至,卻和暖如春辛臊,著一層夾襖步出監(jiān)牢的瞬間仙粱,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工彻舰, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留伐割,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓刃唤,卻偏偏與公主長(zhǎng)得像隔心,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子尚胞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容