題目:
給你兩個(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;
}
參考鏈接:
鏈表相交