相交鏈表
【題目】
找到兩個鏈表相交的起始點
【思路】
如果兩個鏈表無環相交,那麼從相交節點開始,一直到兩個鏈表終止的這一段,是兩個鏈表共享的。
- 鏈表1從頭節點開始,走到最後一個節點,統計鏈表1的長度記爲len1,同時記錄鏈表1的最後一個節點記爲end1
- 鏈表2從頭節點開始,走到最後一個節點,統計鏈表2的長度記爲len2,同時記錄鏈表2的最後一個節點記爲end2
- 此時如果cur1 != cur2,說明兩個鏈表不相交,返回null即可;如果cur1 == cur2,說明兩個鏈表有交點,進入下一步來尋找第一個交點
- 如果鏈表1比較長,鏈表1就先走len1-len2步瞭如果鏈表2比較長,鏈表2就先走len2-len1步。然後兩個鏈表一起走,一起走的過程中,兩個鏈表第一次走到一起的那個節點就是第一個相交的節點
【代碼】
public ListNode getIntersetionNode(ListNode head1,ListNode head2){
if(head1 == null || head2 == null){
return null;
}
ListNode cur1 = head1;
ListNode cur2 = head2;
int n = 0;
while(cur1.next != null){
n++;
cur1 = cur1.next;
}
while(cur2.next != null){
n--;
cur2 = cur2.next;
}
if(cur1 != cur2){
return null;
}
cur1 = n > 0 ? head1 : head2;
cur2 = cur1 == head1 ? head2 : head1;
n = Math.abs(n);
while(n != 0){
n--;
cur1 = cur1.next;
}
while(cur1 != cur2){
cur1 = cur1.next;
cur2 = cur2.next
}
return cur1;
}