- 遍历第一个链表
求长度M - 遍历第二个链表
求长度N - 选择M和N中较大的那个
- 将较长的链表遍历至第M-N个节点
- 然后在两个链表中同步遍历,比较next指针是否相等且不为NULL。
- 如果相等,则next指针所指的元素即为交点。
- 如果为NULL,说明两个链表都到了末端还没有相交。
代码:
- Node*
find(Node* head1,Node* head2) - {
-
Node *p1=head1,*p2=head2; -
int m=0,n=0; -
while(p1)//O(len1) -
{ -
p1=p1->next; -
m++; -
} -
while(p2)//O(len2) -
{ -
p2=p2->next; -
n++; -
} -
p1=head1; -
p2=head2; -
-
if(m>n) -
{ -
for(i=0;i -
p1=p1->next; -
} -
else -
{ -
for(i=0;i -
p2=p2->next; -
}//O(abs(len1-len2)) -
while(p1!=p2) -
{ -
p1=p1->next; -
p2=p2->next; -
}//O(min(len1,len2)) -
return p1; - }