36相交鏈表

編寫(xiě)一個(gè)程序瑞妇,找到兩個(gè)單鏈表相交的起始節(jié)點(diǎn)。

示例 1:
輸入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
輸出:Reference of the node with value = 8
輸入解釋?zhuān)合嘟还?jié)點(diǎn)的值為 8 (注意,如果兩個(gè)鏈表相交則不能為 0)实抡。從各自的表頭開(kāi)始算起阁簸,鏈表 A 為 [4,1,8,4,5]授舟,鏈表 B 為 [5,0,1,8,4,5]牡直。在 A 中缀匕,相交節(jié)點(diǎn)前有 2 個(gè)節(jié)點(diǎn)纳决;在 B 中碰逸,相交節(jié)點(diǎn)前有 3 個(gè)節(jié)點(diǎn)。

示例 2:
輸入:intersectVal = 2, listA = [0,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1
輸出:Reference of the node with value = 2
輸入解釋?zhuān)合嘟还?jié)點(diǎn)的值為 2 (注意阔加,如果兩個(gè)鏈表相交則不能為 0)饵史。從各自的表頭開(kāi)始算起,鏈表 A 為 [0,9,1,2,4]刻坊,鏈表 B 為 [3,2,4]曲饱。在 A 中枣宫,相交節(jié)點(diǎn)前有 3 個(gè)節(jié)點(diǎn);在 B 中吭露,相交節(jié)點(diǎn)前有 1 個(gè)節(jié)點(diǎn)。

示例 3:
輸入:intersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2
輸出:null
輸入解釋?zhuān)簭母髯缘谋眍^開(kāi)始算起尊惰,鏈表 A 為 [2,6,4]讲竿,鏈表 B 為 [1,5]。由于這兩個(gè)鏈表不相交弄屡,所以 intersectVal 必須為 0题禀,而 skipA 和 skipB 可以是任意值。
解釋?zhuān)哼@兩個(gè)鏈表不相交膀捷,因此返回 null迈嘹。

注意:
如果兩個(gè)鏈表沒(méi)有交點(diǎn),返回 null.
在返回結(jié)果后全庸,兩個(gè)鏈表仍須保持原有的結(jié)構(gòu)秀仲。
可假定整個(gè)鏈表結(jié)構(gòu)中沒(méi)有循環(huán)。
程序盡量滿足 O(n) 時(shí)間復(fù)雜度壶笼,且僅用 O(1) 內(nèi)存神僵。

解題思路:
我們通常做這種題的思路是設(shè)定兩個(gè)指針?lè)謩e指向兩個(gè)鏈表頭部,一起向前走直到其中一個(gè)到達(dá)末端拌消,另一個(gè)與末端距離則是兩鏈表的 長(zhǎng)度差挑豌。再通過(guò)長(zhǎng)鏈表指針先走的方式消除長(zhǎng)度差安券,最終兩鏈表即可同時(shí)走到相交點(diǎn)。
換個(gè)方式消除長(zhǎng)度差: 拼接兩鏈表氓英。
設(shè)長(zhǎng)-短鏈表為 C侯勉,短-長(zhǎng)鏈表為 D (分別代表長(zhǎng)鏈表在前和短鏈表在前的拼接鏈表),則當(dāng) C 走到長(zhǎng)短鏈表交接處時(shí)铝阐,D 走在長(zhǎng)鏈表中址貌,且與長(zhǎng)鏈表頭距離為 長(zhǎng)度差;

class Solution:
    def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
        ha, hb = headA, headB
        while ha != hb:
            ha = ha.next if ha else headB
            hb = hb.next if hb else headA
        return ha

分別為鏈表A和鏈表B設(shè)置指針A和指針B,然后開(kāi)始遍歷鏈表徘键,如果遍歷完當(dāng)前鏈表练对,則將指針指向另外一個(gè)鏈表的頭部繼續(xù)遍歷,直至兩個(gè)指針相遇吹害。
最終兩個(gè)指針?lè)謩e走過(guò)的路徑為:
指針A :a+c+b
指針B :b+c+a
明顯 a+c+b = b+c+a,因而如果兩個(gè)鏈表相交螟凭,則指針A和指針B必定在相交結(jié)點(diǎn)相遇。

class Solution:
    def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
        if not headA or not headB:
            return None
        nodeA = headA
        nodeB = headB
        while(nodeA !=nodeB):
            nodeA = nodeA.next if nodeA else headB
            nodeB = nodeB.next if nodeB else headA
        return nodeA

存鏈表節(jié)點(diǎn)進(jìn)行查詢
(1)遍歷鏈表A它呀,并將其節(jié)點(diǎn)存入集合(2)遍歷B的每個(gè)節(jié)點(diǎn)并在集合中進(jìn)行查詢螺男,一旦遍歷過(guò)程中查詢到相同節(jié)點(diǎn),即說(shuō)明有交點(diǎn)纵穿,否則無(wú)

class Solution:
    def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
        A = set()
        cur1 = headA
        cur2 = headB
        while cur1:
            A.add(cur1)
            cur1 = cur1.next
        while cur2:
            if cur2 in A:
                return cur2
            cur2 = cur2.next
        return None

算出鏈表距離差挨個(gè)對(duì)比
分別遍歷兩個(gè)鏈表下隧,并記錄兩鏈表的長(zhǎng)度差n,將出現(xiàn)兩種情況谓媒,(1)如果遍歷完淆院,尾部的空節(jié)點(diǎn)不是同一節(jié)點(diǎn)(內(nèi)存地址不同),那么必然是不相交
(2)若是同一節(jié)點(diǎn)句惯,則說(shuō)明兩鏈表存在相交土辩,讓長(zhǎng)鏈表先走n步,再同時(shí)開(kāi)始走宗弯,并對(duì)比兩個(gè)鏈表的當(dāng)前節(jié)點(diǎn)脯燃,節(jié)點(diǎn)相等時(shí)即為交點(diǎn)

class Solution:
    def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
        cur1 = headA
        cur2 = headB
        n = 0
        while cur1:
            n += 1
            cur1 = cur1.next
        while cur2:
            n -= 1
            cur2 = cur2.next
        if cur1 != cur2:
            return None
        cur1 = headA if n > 0 else headB
        cur2 = headB if cur1 == headA else headA
        n = abs(n)
        while n:
            n -= 1
            cur1 = cur1.next
        while cur1 != cur2:
            cur1 = cur1.next
            cur2 = cur2.next
        return cur1

        
        return None

來(lái)源:力扣(LeetCode)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蒙保,隨后出現(xiàn)的幾起案子辕棚,更是在濱河造成了極大的恐慌,老刑警劉巖邓厕,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逝嚎,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡详恼,警方通過(guò)查閱死者的電腦和手機(jī)补君,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)昧互,“玉大人挽铁,你說(shuō)我怎么就攤上這事伟桅。” “怎么了叽掘?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵楣铁,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我更扁,道長(zhǎng)盖腕,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任浓镜,我火速辦了婚禮溃列,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘膛薛。我一直安慰自己听隐,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布相叁。 她就那樣靜靜地躺著遵绰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪增淹。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,737評(píng)論 1 305
  • 那天乌企,我揣著相機(jī)與錄音虑润,去河邊找鬼。 笑死加酵,一個(gè)胖子當(dāng)著我的面吹牛拳喻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播猪腕,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼冗澈,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了陋葡?” 一聲冷哼從身側(cè)響起亚亲,我...
    開(kāi)封第一講書(shū)人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎腐缤,沒(méi)想到半個(gè)月后捌归,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡岭粤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年惜索,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片剃浇。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡巾兆,死狀恐怖猎物,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情角塑,我是刑警寧澤霸奕,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站吉拳,受9級(jí)特大地震影響质帅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜留攒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一煤惩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧炼邀,春花似錦魄揉、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至杰标,卻和暖如春兵怯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背腔剂。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工媒区, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人掸犬。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓袜漩,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親湾碎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子宙攻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355