找出单链表的第一个公共节点

62.找出链表的第一个公共结点。 题目:两个单向链表,找出它们的第一个公共结点。

两个单向的链表如果有公共节点,则其一定是Y形状的。从第一个公共节点开始都是一样的。

第一个公共节点之前是不同的。

如果这两个链表是长度相同的,那么可以两个链表遍历,直到找到二者相同的节点为止,就为第一个公共节点。

如果这两个链表的长度不同,那么就先把这两个链表对齐,然后从对齐的节点开始遍历两个链表,直到找到第一个相同的 节点为止。

Head1->p0->p1->p2->p3->p4->NULL;

Head2->s0->s1->s2->s3->s4->NULL;

 

先求其长度

typedef struct LinkNode

{

   int data;

   LinkNode *next;

}node;

 

int length(node *head)

{

     int len = 0;

     node *p;

     p = head->next;

     while(p!=NULL)

    {   

        len++;

        p = p->next;

    }

    return len;

}

 

node *findx(node *head1,node *head2)

{

         int len1;len2;

         int i,j;

         node *tmp1,*tmp2;

         tmp1 = head1->next;

         tmp2 = head2->next;

         len1 = length(head1);

         len2 = length(head2);

         if( len1 > len2 )

         {

              for( i = 0 ; i< (len1-len2) ; i++)

              {

                    tmp1 = tmp1->next;

               }

         }

         if(len1 < len2)

        {

              for(i = 0;i< (len2-len1) ; i++)

               {

                      tmp2 = tmp2->next;

               }

        }

         while( (tmp1 != NULL) &&(tmp2 != NULL))

         {

                if( tmp1 == tmp2 )

                {

                      return tmp1;

                      break;

                } 

               else

               {

                         tmp1 = tmp1->next;

                         tmp2 = tmp2->next;

               }

         }

        

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值