160. Intersection of Two Linked Lists

Description

Write a program to find the node at which the intersection of two singly linked lists begins.

For example, the following two linked lists:

begin to intersect at node c1.
Notes:
If the two linked lists have no intersection at all, return null
.
The linked lists must retain their original structure after the function returns.
You may assume there are no cycles anywhere in the entire linked structure.
Your code should preferably run in O(n) time and use only O(1) memory.

Credits:Special thanks to @stellari for adding this problem and creating all test cases.

Solution

Two iterations with counting length

先遍歷一遍花吟,計(jì)算出兩個(gè)list的長度。然后讓長的鏈表的頭指針多走幾步,之后雙指針一起走直到相遇(可能為null)压昼。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        int l1 = getLength(headA);
        int l2 = getLength(headB);
        
        if (l1 < l2) {
            return getIntersectionNode(headB, headA);
        }
        // make sure l1 >= l1
        for (int i = l2; i < l1; ++i) {
            headA = headA.next;
        }
        
        while (headA != headB) {    // iterate until two list meet
            headA = headA.next;
            headB = headB.next;
        }
        
        return headA;
    }
    
    private int getLength(ListNode head) {
        int len = 0;
        
        while (head != null) {
            ++len;
            head = head.next;
        }
        
        return len;
    }
}

Two iterations without counting length

其實(shí)沒有必要計(jì)算list length石蔗,只需要排除掉長度差距即可蠢涝,可以在第一遍遍歷時(shí)如果走到null則切換到另一個(gè)list head派阱,這樣兩個(gè)指針就可以到同一個(gè)起跑線了切诀。

public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        ListNode p = headA;
        ListNode q = headB;

        while (p != q) {
            p = p != null ? p.next : headB;
            q = q != null ? q.next : headA;
        }
        
        return p;
    }
}

Follow-up: How to detect if two linked lists have intersection?

其實(shí)比原題目簡單揩环,因?yàn)橹恍枰祷豣oolean即可,基本有下面幾種做法:

  • 將ListA的所有節(jié)點(diǎn)存入HashSet中幅虑,然后遍歷ListB丰滑,看是否有重合。
  • 兩個(gè)鏈表如果相交倒庵,tail node一定相同褒墨。那么可以找到tailA和tailB炫刷,比較是否相等即可。

但是這里有一個(gè)坑貌亭。如果input list有環(huán)怎么辦柬唯?這樣就找不到tail了认臊。這種情況下圃庭,需要結(jié)合HashSet + findTail兩種做法,對于listB來說失晴,find tail的同時(shí)查詢HashSet中是否已經(jīng)有該節(jié)點(diǎn)剧腻,如果有那么當(dāng)前節(jié)點(diǎn)即為偽tail;否則將節(jié)點(diǎn)加入到HashSet中涂屁。

遍歷listB時(shí)也要維護(hù)listB的HashSet书在,如果listB已經(jīng)遍歷一圈還沒有遇到和listA的intersection,即為不相交拆又。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末儒旬,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子帖族,更是在濱河造成了極大的恐慌栈源,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件竖般,死亡現(xiàn)場離奇詭異甚垦,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)涣雕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門艰亮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人挣郭,你說我怎么就攤上這事迄埃。” “怎么了兑障?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵侄非,是天一觀的道長。 經(jīng)常有香客問我旺垒,道長彩库,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任先蒋,我火速辦了婚禮骇钦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘竞漾。我一直安慰自己眯搭,他們只是感情好窥翩,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鳞仙,像睡著了一般寇蚊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上棍好,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天仗岸,我揣著相機(jī)與錄音,去河邊找鬼借笙。 笑死扒怖,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的业稼。 我是一名探鬼主播盗痒,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼低散!你這毒婦竟也來了俯邓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤熔号,失蹤者是張志新(化名)和其女友劉穎稽鞭,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體跨嘉,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡川慌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了祠乃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片梦重。...
    茶點(diǎn)故事閱讀 39,834評論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖亮瓷,靈堂內(nèi)的尸體忽然破棺而出琴拧,到底是詐尸還是另有隱情,我是刑警寧澤嘱支,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布蚓胸,位于F島的核電站,受9級特大地震影響除师,放射性物質(zhì)發(fā)生泄漏沛膳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一汛聚、第九天 我趴在偏房一處隱蔽的房頂上張望锹安。 院中可真熱鬧,春花似錦、人聲如沸叹哭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽风罩。三九已至糠排,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間超升,已是汗流浹背入宦。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留廓俭,地道東北人云石。 一個(gè)月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像研乒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子淋硝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評論 2 354

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