编写一个程序,找到两个单链表相交的起始节点。
例如,下面的两个链表:
A: a1 → a2 ↘ c1 → c2 → c3 ↗ B: b1 → b2 → b3
在节点 c1 开始相交。
注意:
- 如果两个链表没有交点,返回
null
. - 在返回结果后,两个链表仍须保持原有的结构。
- 可假定整个链表结构中没有循环。
- 程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。
如果两个链表相交,他们最后结点一定是相同的
两个链表相交,让长的先走它们之间的距离差,再一起走,就可以得到第一个相交的结点
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if(headA==null||headB==null){
return null;
}
ListNode A = headA;
ListNode B = headB;
int Alength = 0;
int Blength = 0;
while(A.next!=null){
Alength++;
A=A.next;
}
while(B.next!=null){
Blength++;
B=B.next;
}
if(A!=B){
return null;
}
A=headA;
B=headB;
int diff = Alength-Blength;
if(Alength<Blength){
diff=-diff;
A=headB;
B=headA;
}
for(int i=0;i<diff;i++){
A=A.next;
}
while((A!=null&&B!=null)&&A!=B){
A=A.next;
B=B.next;
}
return B;
}
}