编写一个程序,找到两个单链表相交的起始节点。
例如,下面的两个链表:
A: a1 → a2 ↘ c1 → c2 → c3 ↗ B: b1 → b2 → b3
在节点 c1 开始相交。
注意:
- 如果两个链表没有交点,返回
null
. - 在返回结果后,两个链表仍须保持原有的结构。
- 可假定整个链表结构中没有循环。
- 程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。
致谢:
特别感谢 @stellari 添加此问题并创建所有测试用例。
解法1:找到两链表长度之差,较长的一方则移动差值,之后在进行比较
只能解两链表后置相同的情况
比如说:a链表长度为3 b链表长度为10 相同部分为a链表的1-3,b链表的2-4
这种情况此解法就无法比较
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
int aLen=0;
int bLen=0;
ListNode tempA=headA;
ListNode tempB=headB;
while (headA!=null){
aLen++;
headA=headA.next;
}
while (headB!=null){
bLen++;
headB= headB.next;
}
int N=0;
if(aLen>bLen){
N=aLen-bLen;
for (int i = 0; i < N; i++) {
tempA=tempA.next;
}
}else if(bLen>aLen){
N=bLen-aLen;
for (int i = 0; i < N; i++) {
tempB=tempB.next;
}
}
while (tempA!=null){
if(tempA==tempB){
return tempA;
}else{
tempA=tempA.next;
tempB=tempB.next;
}
}
return null;
}
}
解法2:逐个比较,但是在平台上跑的时候会出现超时
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if (headA == null || headB == null) {
return null;
}
while (headA != null) {
ListNode tempHeadB=headB;
while (tempHeadB!=null){
if(headA!=tempHeadB){
if(tempHeadB.next!=null) {
tempHeadB = tempHeadB.next;
}else{
break;
}
}else{
return headA;
}
}
headA = headA.next;
}
return null;
}