求两个链表的相交节点(算法)

来源:互联网 发布:斯米克和马可波罗 知乎 编辑:程序博客网 时间:2024/05/16 09:06
  1. 遍历第一个链表 求长度M  
  2. 遍历第二个链表 求长度N  
  3. 选择M和N中较大的那个  
  4. 将较长的链表遍历至第M-N个节点  
  5. 然后在两个链表中同步遍历,比较next指针是否相等且不为NULL。  
  6. 如果相等,则next指针所指的元素即为交点。  
  7. 如果为NULL,说明两个链表都到了末端还没有相交。

代码:

   
  1. Node* find(Node* head1,Node* head2)     
  2.     
  3.      Node *p1=head1,*p2=head2;     
  4.     int m=0,n=0;     
  5.     while(p1)//O(len1)     
  6.          
  7.          p1=p1->next;     
  8.          m++;     
  9.          
  10.     while(p2)//O(len2)     
  11.          
  12.          p2=p2->next;     
  13.          n++;     
  14.          
  15.      p1=head1;     
  16.      p2=head2;     
  17.           
  18.     if(m>n)     
  19.          
  20.         for(i=0;i
  21.              p1=p1->next;     
  22.          
  23.     else    
  24.          
  25.         for(i=0;i
  26.              p2=p2->next;     
  27.      }//O(abs(len1-len2))     
  28.     while(p1!=p2)     
  29.          
  30.          p1=p1->next;     
  31.          p2=p2->next;     
  32.      }//O(min(len1,len2))     
  33.     return p1;     
  34. }
0 0
原创粉丝点击