題目:
給你兩個單鏈表的頭節(jié)點 headA 和 headB 群嗤,請你找出并返回兩個單鏈表相交的起始節(jié)點剖淀。如果兩個鏈表沒有交點卷雕,返回 null 蒸甜。
題解:
先統(tǒng)計兩個鏈表的長度
還可以先統(tǒng)計兩個鏈表的長度,如果兩個鏈表的長度不一樣睛竣,就讓鏈表長的先走晰房,直到兩個鏈表長度一樣,這個時候兩個鏈表再同時每次往后移一步,看節(jié)點是否一樣殊者,如果有相等的与境,說明這個相等的節(jié)點就是兩鏈表的交點,否則如果走完了還沒有找到相等的節(jié)點猖吴,說明他們沒有交點摔刁,直接返回null即可,來畫個圖看一下海蔽。
最后再來看下代碼
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
//統(tǒng)計鏈表A和鏈表B的長度
int lenA = length(headA), lenB = length(headB);
//如果節(jié)點長度不一樣簸搞,節(jié)點多的先走,直到他們的長度一樣為止
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就是他們的交點
return headA;
}
//統(tǒng)計鏈表的長度
private int length(ListNode node) {
int length = 0;
while (node != null) {
node = node.next;
length++;
}
return length;
}
參考鏈接:
鏈表相交