鏈表相交

題目:

給你兩個(gè)單鏈表的頭節(jié)點(diǎn) headA 和 headB ,請你找出并返回兩個(gè)單鏈表相交的起始節(jié)點(diǎn)。如果兩個(gè)鏈表沒有交點(diǎn),返回 null 。

題解:

先統(tǒng)計(jì)兩個(gè)鏈表的長度

還可以先統(tǒng)計(jì)兩個(gè)鏈表的長度,如果兩個(gè)鏈表的長度不一樣,就讓鏈表長的先走,直到兩個(gè)鏈表長度一樣,這個(gè)時(shí)候兩個(gè)鏈表再同時(shí)每次往后移一步,看節(jié)點(diǎn)是否一樣,如果有相等的,說明這個(gè)相等的節(jié)點(diǎn)就是兩鏈表的交點(diǎn),否則如果走完了還沒有找到相等的節(jié)點(diǎn),說明他們沒有交點(diǎn),直接返回null即可,來畫個(gè)圖看一下。

鏈表相交.png

最后再來看下代碼

public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
    //統(tǒng)計(jì)鏈表A和鏈表B的長度
    int lenA = length(headA), lenB = length(headB);

    //如果節(jié)點(diǎn)長度不一樣,節(jié)點(diǎn)多的先走,直到他們的長度一樣為止
    while (lenA != lenB) {
        if (lenA > lenB) {
            //如果鏈表A長,那么鏈表A先走
            headA = headA.next;
            lenA--;
        } else {
            //如果鏈表B長,那么鏈表B先走
            headB = headB.next;
            lenB--;
        }
    }

    //然后開始比較,如果他倆不相等就一直往下走
    while (headA != headB) {
        headA = headA.next;
        headB = headB.next;
    }
    //走到最后,最終會有兩種可能,一種是headA為空,
    //也就是說他們倆不相交。還有一種可能就是headA
    //不為空,也就是說headA就是他們的交點(diǎn)
    return headA;
}

//統(tǒng)計(jì)鏈表的長度
private int length(ListNode node) {
    int length = 0;
    while (node != null) {
        node = node.next;
        length++;
    }
    return length;
}

參考鏈接:
鏈表相交

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容