LeetCode 每日一題 [65] 兩個(gè)鏈表的第一個(gè)公共節(jié)點(diǎn)

LeetCode 兩個(gè)鏈表的第一個(gè)公共節(jié)點(diǎn) [簡(jiǎn)單]

輸入兩個(gè)鏈表,找出它們的第一個(gè)公共節(jié)點(diǎn)。

如下面的兩個(gè)鏈表:

在節(jié)點(diǎn) c1 開始相交。

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/liang-ge-lian-biao-de-di-yi-ge-gong-gong-jie-dian-lcof

示例 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
輸入解釋:相交節(jié)點(diǎn)的值為 8 (注意,如果兩個(gè)列表相交則不能為 0)。從各自的表頭開始算起,鏈表 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
輸入解釋:相交節(jié)點(diǎn)的值為 2 (注意,如果兩個(gè)列表相交則不能為 0)。從各自的表頭開始算起,鏈表 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
輸入解釋:從各自的表頭開始算起,鏈表 A 為 [2,6,4],鏈表 B 為 [1,5]。由于這兩個(gè)鏈表不相交,所以 intersectVal 必須為 0,而 skipA 和 skipB 可以是任意值。
解釋:這兩個(gè)鏈表不相交,因此返回 null。

注意:

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

題目分析
解法1

雙指針解法 方法思路來自C++解法:https://leetcode-cn.com/problems/liang-ge-lian-biao-de-di-yi-ge-gong-gong-jie-dian-lcof/solution/shuang-zhi-zhen-fa-lang-man-xiang-yu-by-ml-zimingm/

解法2

先獲得鏈表的長(zhǎng)度,然后比二者的長(zhǎng)度,都先遍歷到和較小的長(zhǎng)度的鏈表,然后繼續(xù)比較遍歷,返回結(jié)果,因?yàn)榻Y(jié)果如果有的話,肯定就在較短的鏈表里面找 但是超時(shí)了

代碼實(shí)現(xiàn)
public class GetIntersectionNode {

    public ListNode getIntersectionNode1(ListNode headA, ListNode headB) {
        int sizeA = getSize(headA);
        int sizeB = getSize(headB);
        ListNode A = headA, B = headB;
        if (sizeA > sizeB) {
            for (int i = 0; i < sizeA - sizeB; i++) {
                A = A.next;
            }
        } else {
            for (int i = 0; i < sizeB - sizeA; i++) {
                B = B.next;
            }
        }
        while (A != B) {
            A = A.next;
            B = B.next;
        }
        return A;
    }

    private static int getSize(ListNode head) {
        int length = 0;
        ListNode temp = head;
        while (temp != null) {
            length++;
        }
        return length;
    }

    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        if (headA == null || headB == null) {
            return null;
        }
        ListNode node1 = headA, node2 = headB;
        while (node1 != node2) {
            node1 = node1 != null ? node1.next : headB;
            node2 = node2 != null ? node2.next : headA;
        }
        return node1;
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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