刷題LeetCode:160.相交鏈表

題目鏈接: 力扣

題目描述

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

題目數(shù)據(jù) 保證 整個鏈式結(jié)構(gòu)中不存在環(huán)。

函數(shù)返回結(jié)果后,鏈表必須 保持其原始結(jié)構(gòu) 。

題目分析

兩鏈表是相交,不是交叉,因而只要找到相交的起始結(jié)點,之后的結(jié)點都認為是相交的。

如下圖所示,相交的起始結(jié)點認為是c1

代碼實現(xiàn)

解題思路1:哈希集合

用哈希集合存儲鏈表A節(jié)點,若集合中存在鏈表B的節(jié)點說明相交。

解題思路2:雙指針

兩鏈表都不為空時,創(chuàng)建兩個指針 pA和 pB,初始時分別指向兩個鏈表的頭節(jié)點 headA 和 headB,然后將兩個指針依次遍歷兩個鏈表的每個節(jié)點。

每步操作需要同時更新指針 pA 和 pB。

如果指針pA 不為空,則將指針移到下一個節(jié)點;如果指針 pB 不為空,則將指針移到下一個節(jié)點。

如果指針pA 為空,則將指針移到鏈表 headB 的頭節(jié)點;如果指針 pB 為空,則將指針移到鏈表headA 的頭節(jié)點。

當指針 pA 和 pB 指向同一個節(jié)點或者都為空時,返回它們指向的節(jié)點或者 null。

  /**
     * hash集合
     *
     * 時間復(fù)雜度:O(m+n),m 和 n 分別指鏈表 headA 和 headB 的長度
     * 空間復(fù)雜度:O(m)
     *
     * @param headA
     * @param headB
     * @return
     */
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        Set<ListNode> set = new HashSet<ListNode>();
        ListNode temp = headA;
        // headA放入集合
        while (temp != null){
            set.add(temp);
            temp = temp.next;
        }
        temp = headB;
        while (temp != null){
            if(set.contains(temp)){
                return temp;
            }
            temp = temp.next;
        }
        return null;
    }


    /**
     * 雙指針
     *
     * 時間復(fù)雜度:O(m+n),m 和 n 分別指鏈表 headA 和 headB 的長度
     * 空間復(fù)雜度:O(1)
     *
     * @param headA
     * @param headB
     * @return
     */
    public ListNode getIntersectionNode2(ListNode headA, ListNode headB) {
        if(headA == null || headB == null){
            return null;
        }
        ListNode pA = headA;
        ListNode pB = headB;
        while (pA != pB){
            pA = pA == null ? headB : pA.next;
            pB = pB == null ? headA : pB.next;
        }
        return pA;
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • 160. 相交鏈表 編寫一個程序,找到兩個單鏈表相交的起始節(jié)點。 示例 1: 輸入:intersectVal = ...
    TheKey_閱讀 323評論 0 1
  • 給你兩個單鏈表的頭節(jié)點 headA 和 headB ,請你找出并返回兩個單鏈表相交的起始節(jié)點。如果兩個鏈表不存在相...
    Abeants閱讀 223評論 0 0
  • 題目描述:編寫一個程序,找到兩個單鏈表相交的起始節(jié)點。 示例: 輸入:intersectVal = 8, list...
    windUtterance閱讀 225評論 0 0
  • 相交鏈表 題目 編寫一個程序,找到兩個單鏈表相交的起始節(jié)點。 示例 1:輸入:intersectVal = 8, ...
    Liori閱讀 95評論 0 0
  • 1 簡介 題目傳送門leetcode160。 這個問題主要解決的是,找尋兩個鏈表中相交的鏈表。為此,我們首先應(yīng)該明...
    一盤好書閱讀 832評論 0 0

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