单链表第十四题(提取公共元素)

 14.设A和B是两个单链表(带头节点),其中元素递增有序。

设计一个算法从A和B中的公共元素产生单链表C,要求不破坏A、B节点

/*

   设A、B是两个单链表(带头节点),其中元素递增有序,

     设计一个算法从A、B中的公共元素产生单链表C,

     要求不破坏A,B节点

分析:

        要求不破坏A、B节点,故我们需要重新创建分配节点空间,来进行连接。

        为寻找公共元素,每遍历A中的一个与B中元素一一比较,

        同则取值给另以空间节点,连接到C上;时间复杂度为0(n^2)。

        因为这两个链表是递增有序的,那我们可以设置连个指针同步比较,

        相同则加入C;不同,小的那个往后移,这一样时间复杂度为O(n);

*/

#include<stdio.h>

#include<stdlib.h>

#include"linkStruct.h"//通过自创建头文件引入结构体,ctrl+鼠标左键点击即可查看

void   linkCommon(Link  *a,Link  *b,Link  *c){

          Link      *lc=c,*la=a->next,*lb=b->next,*rc=lc;

          while(la){

                while(lb){

                      if(la->data==lb->data)//如果是公共元素

                       Link *p=(Link*)malloc(sizeof(Link));

                       p->data=la->data;

                        rc->next=p;

                         rc=p;

                          break;

                        }

                       lb=lb->next;      

              }

            la=la->next;

            lb=b->next;

}

rc->next=NULL;//最后一个节点指针需要指向NULL、

}

void   listCommon(Link   *a,Link   *b,Link    *c){

          Link   *rc=c,*la=a->next,*lb=b->next;

           while(la&&lb){

                  if(la->data==lb->data){

                       Link   *p=(Link*)malloc(sizeof(Linkl));

                       p->data=la->data;

                      p->next=NULL;

                        rc->next=p;

                        rc=p;

                        la=la->next;

                        lb=la->next;

                      }

                       else{

                              la->data<lb->data?la=la->next:lb=lb->next;

                                 }

              }

              rc->next=NULL;

}

int  main(){

            Link  *a,*b;

             Link   *createLink(int);

           void  printfNowLink(Link  *);

             a=createLink(0);

             b=createLink(0);

             Link  *c=(Link*)malloc(sizeof(Link));

             c->next=NULL;

               //linkCommon(a,b,c);

              listCommon(a,b,c);

               printfNowLink(c);

                return    0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值