基于链表的两个集合的差集
描述
给定两个递增的整数集合,分别用链表A和B表示,求出A和B的差集(即仅由在A中出现而不在B中出现的元素所构成的集合),并以同样的形式存储,同时返回该集合的元素个数。要求空间复杂度为O(1)。
输入
多组数据,每组数据有三行,第一行为序列A和B的长度n和m,第二行为序列A的n个元素,第三行为序列B的m个元素(元素之间用空格分隔)。n=0且m=0时输入结束。
输出
对于每组数据输出两行,第一行是A和B的差集,第二行为差集中的元素个数,每个数据之间用空格分隔。
输入样例、 输出样例
7 9
2
1 6
2
5 5
1 3 5 7 9
1 2 3 4 5
3 4
1 2 6
2 4 5 7
0 0
实现代码
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 #include<math.h> 5 #define MAXSIZE 1000 6 #define OVERFLOW -2 7 #define OK 1 8 #define ERROR 0 9 10 typedef struct LNode{ 11 int num; 12 struct LNode *next; 13 }LNode,* LinkList; 14 15 void Inist_List(LinkList& L){ 16 L=new LNode; 17 L->next=NULL; 18 } 19 20 void Zuhe(LinkList& L1,LinkList& L2){ 21 LinkList H1=L1,H2=L2; 22 int m,n; 23 while(1){ 24 scanf("%d%d",&m,&n); 25 if(m==0&&n==0) 26 break; 27 for(int i=0;i<m;i++){ 28 LinkList p= new LNode; 29 scanf("%d",&p->num); 30 p->next=NULL; 31 L1->next=p; 32 L1=p; 33 } 34 L1=H1; 35 for(int i=0;i<n;i++){ 36 LinkList p= new LNode; 37 scanf("%d",&p->num); 38 p->next=NULL; 39 L2->next=p; 40 L2=p; 41 } 42 L2=H2; 43 LinkList p,p1=L1->next,p2=L2->next,p3=L1; 44 while(p1&&p2){ 45 if(p1->num==p2->num){ 46 p1=p1->next; 47 p2=p2->next; 48 } 49 else if(p1->num>p2->num){ 50 p2=p2->next; 51 } 52 else if(p1->num<p2->num){ 53 p3->next=p1; 54 p1=p1->next; 55 p3=p3->next; 56 } 57 if(!p2) 58 p3->next=p1;//指向第一个链表的末尾部分 59 } 60 LinkList b; 61 b=L1; 62 while(b->next->next) 63 { 64 b=b->next; 65 printf("%d ",b->num); 66 } 67 printf("%d\n",b->next->num); 68 LinkList T=L1->next; 69 int i=0; 70 while(T){ 71 T=T->next; 72 i++; 73 } 74 printf("%d\n",i); 75 } 76 } 77 78 int main(){ 79 LinkList L1,L2; 80 Inist_List(L1); 81 Inist_List(L2); 82 Zuhe(L1,L2); 83 return 0; 84 }

浙公网安备 33010602011771号