样例
下列两个链表:
A: a1 → a2
↘
c1 → c2 → c3
↗
B: b1 → b2 → b3
在节点 c1 开始交叉。
注意
- 如果两个链表没有交叉,返回
null
。 - 在返回结果后,两个链表仍须保持原有的结构。
- 可假定整个链表结构中没有循环。
需满足 O(n) 时间复杂度,且仅用 O(1) 内存。
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
// write your code here
if(headA==NULL||headB==NULL) return NULL;
ListNode* tmpA=headA;
while(tmpA->next){
tmpA=tmpA->next;
}
tmpA->next=headA;
ListNode *slow=headB,*fast=headB;
while(1){
slow=slow->next;
fast=fast->next->next;
if(slow==fast){
break;
}
}
slow=headB;
while(slow!=fast){
slow=slow->next;
fast=fast->next;
}
tmpA->next=NULL;
return slow;
}
};
法二
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
// write your code here
if(headA==NULL||headB==NULL) return NULL;
ListNode* tmpA=headA;int la=1;
ListNode* tmpB=headB;int lb=1;
while(tmpA->next){
tmpA=tmpA->next;
la++;
}
while(tmpB->next){
tmpB=tmpB->next;
lb++;
}
tmpA=headA;tmpB=headB;
while(la>lb){
tmpA=tmpA->next;
la--;
}
while(la<lb){
tmpB=tmpB->next;
lb--;
}
while(tmpA!=tmpB){
tmpA=tmpA->next;
tmpB=tmpB->next;
}
return tmpA;
}
};