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;
}