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

在節(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;
}
}


