基于链表的两个集合的差集

描述

 

给定两个递增的整数集合,分别用链表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 }

 

posted @ 2020-10-11 16:49  奕玑  阅读(381)  评论(0)    收藏  举报