题目描述:
Write a program to find the node at which the intersection of two singly linked lists begins.
For example, the following two linked lists:
A: a1 → a2 ↘ c1 → c2 → c3 ↗ B: b1 → b2 → b3
begin to intersect at node c1.
Notes:
- If the two linked lists have no intersection at all, return
null
. - The linked lists must retain their original structure after the function returns.
- You may assume there are no cycles anywhere in the entire linked structure.
- Your code should preferably run in O(n) time and use only O(1) memory.
时间复杂度和空间复杂度都有限制。
如果两个有重叠,重叠部分的长度肯定是相等的。那就接去较长链表多余的部分,然后一个一个比较,若相等则是交叉点。
代码如下:
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
int sum1=0,sum2=0;
ListNode curA=headA,curB=headB;
while(curA!=null){
sum1++;
curA=curA.next;
}
while(curB!=null){
sum2++;
curB=curB.next;
}
curA=headA;curB=headB;
if(sum1>sum2){
int n=sum1-sum2+1;
while(n-->1)
curA=curA.next;
}
if(sum2>sum1){
int n=sum2-sum1+1;
while(n-->1)
curB=curB.next;
}
while(curA!=null){
if(curA==curB)
return curA;
curA=curA.next;
curB=curB.next;
}
return null;
}