方法一
1.先遍历一遍两个链表,求出它们的长度以及长度差diff。
2.将两个指针pa和pb分别指向链表A和B的头节点,并让长链表先走diff步。
3.然后两个指针同时开始遍历链表,如果存在交点,则在某个时刻两个指针会相遇,否则两个指针都会指向 NULL。
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
struct ListNode *pa = headA,*pb=headB;
int i=0,j=0,diff=0;
while(pa){
++i;
pa=pa->next;
}
while(pb){
++j;
pb=pb->next;
}
pa=headA;
pb=headB;
diff = abs(i-j);
if (i>j){
while(diff--){
pa=pa->next;
}
}else{
while(diff--){
pb=pb->next;
}
}
while(pa&&pb){
if (pa==pb)
return pa;
pa=pa->next;
pb=pb->next;
}
return NULL;
}
方法二(双指针)
使用了双指针法来解决两个链表的交点问题。其中,指针 A 和指针 B 分别指向链表 A 和链表 B 的头节点。然后,每次迭代时,指针 A 和指针 B 同时向后移动一个节点,当指针 A 到达链表末尾时,将它重新指向链表 B 的头节点;当指针 B 到达链表末尾时,将它重新指向链表 A 的头节点。这样,指针 A 和指针 B 最终会在交点处相遇。
需要注意的是,在实际代码中,我们首先判断指针 A 和指针 B 是否相等,如果相等则直接返回交点,如果不相等则继续迭代。当两个指针都到达链表末尾时,最终会返回 NULL,表示没有交点。
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode *A = headA, *B = headB;
while (A != B) {
A = A != nullptr ? A->next : headB;
B = B != nullptr ? B->next : headA;
}
return A;
}
};