描述
给定两个递增的整数集合,分别用链表A和B表示,求出A和B的差集(即仅由在A中出现而不在B中出现的元素所构成的集合),并以同样的形式存储,同时返回该集合的元素个数。要求空间复杂度为O(1)。
输入
多组数据,每组数据有三行,第一行为序列A和B的长度n和m,第二行为序列A的n个元素,第三行为序列B的m个元素(元素之间用空格分隔)。n=0且m=0时输入结束。
输出
对于每组数据输出两行,第一行是A和B的差集,第二行为差集中的元素个数,每个数据之间用空格分隔。
输入样例 1
5 5 1 3 5 7 9 1 2 3 4 5 3 4 1 2 6 2 4 5 7 0 0
输出样例 1
7 9 2 1 6 2
#include<iostream>
#include<string>
#include<stdio.h>
#include<iomanip>
#include<string.h>
#define MAXSIZE 1000
#define OK 1
using namespace std;
typedef struct LNode
{
int data;
struct LNode *next;//结点的指针域
}LNode,*LinkList;
int InitList(LinkList &L)
{
L=new LNode;
L->next=NULL;
return OK;
}
int MergeList(LinkList &LA,LinkList &LB){
int n1,n2;
LinkList r1 = LA;
LinkList r2 = LB;//尾插法建立单链表
while(cin>>n1>>n2&&n1!=0&&n2!=0){
for(int i = 0;i<n1;i++){
LinkList p =new LNode;
cin>>p->data;
p->next = NULL;
r1->next = p;
r1 = p;
}
r1 = LA;
for(int i = 0;i<n2;i++){
LinkList p =new LNode;
cin>>p->data;
p->next = NULL;
r2->next = p;
r2 = p;
}
r2 = LB;
LinkList pa,pb,pc;
pa=LA->next; //pa是链表LA的工作指针 初始化为首元结点
pb=LB->next; //pb是链表LB的工作指针 初始化为首元结点
pc = LA; //用LA的头节点作为LC的头节点 pc为La中所指结点的前驱结点的指针
LA->data = 0;//计数差集中的元素个数
while(pa&&pb){
if(pa->data ==pb->data) //相同的元素不保留
{
pa = pa->next;
pb = pb->next;
}
else if(pa->data<pb->data) //出现不同元素
{
pc->next=pa;
pc=pa;
pa=pa->next;
LA->data++;
}
else if(pa->data > pb->data){ //A链表中当前结点指针后移
pb = pb->next;
}
}
LinkList p =pa; //首元结点
while(pa){
pc->next=pa;
pc=pa;
pa=pa->next;
LA->data++;
} //保存LA中的节点
pc->next=NULL;
p=LA->next; //输出
while(p->next){
cout<<p->data<<" ";
p = p->next;
}
cout<<p->data<<endl;
cout<<LA->data<<endl;
}
return OK;
}
int main()
{
LinkList LA,LB;
InitList(LA);
InitList(LB);
MergeList(LA,LB);
return 0;
}