算法思路,转载自CSDN博客,不是我想到的,呵呵
- 遍历第一个链表 求长度M
- 遍历第二个链表 求长度N
- 选择M和N中较大的那个
- 将较长的链表遍历至第M-N个节点
- 然后在两个链表中同步遍历,比较next指针是否相等且不为NULL。
- 如果相等,则next指针所指的元素即为交点。
- 如果为NULL,说明两个链表都到了末端还没有相交。
代码:
- /***********************************/
- /* 功能:求两个单链表是否相交和交点*/
- /* 转载自CSDN博客 */
- /* 日期:2010/03/29 */
- /***********************************/
- 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<m-n;i++)
- p1=p1->next;
- }
- else
- {
- for(i=0;i<n-m;i++)
- p2=p2->next;
- }//O(abs(len1-len2))
- while(p1!=p2)
- {
- p1=p1->next;
- p2=p2->next;
- }//O(min(len1,len2))
- return p1;
- }