解题思路: 首先,定义链表结点的结构,然后分别按照输入的你n,m来作为链表A和链表B的结点数,再分别构建起链表。
最重要的一步就是两个链表的求交集,我才用的方法是,先把A的头节点与链表的本体分开,再分别按节点顺序与B的结点比较,如果A的结点大于B的结点,则B的遍历指针就往后移一位,否则就是A的遍历指针往后移一位。若两个结点相等则把A上的这个结点取下来,接到头节点A上,知道某个链表遍历完成。这样得到的链表里面会有重复的值,但是交集是不含有重复值的,所以还有对这个链表去重。下面是我的代码,用C++写的。
#include<iostream>
#include<malloc.h>
#define elemtype int
using namespace std;
//定义结构体
typedef struct node{
elemtype data;
struct node *next;
}*linklist;
//初始化结点
node* InitNode(elemtype x){
node* s = new node;
s->data = x;
s->next = nullptr;
return s;
}
//求交集
node* merge(node* la,node* lb)
{
node* p=la;
node* pa=la->next,*pb=lb->next,*t;
la->next=nullptr;//头节点断开
while(pa&&pb)
{
if(pa->data<pb->data) pa=pa->next;
else if(pa->data>pb->data) pb=pb->next;
else //如果相等,则取其中一个放在la中即可
{
t=pa;
pa=pa->next;
p->next=t;
p=t;
}
}
return la;
}
void QuChong(linklist &l){
linklist p = l->next;
while(p->next!=nullptr){
if(p->data == p->next->data){
p->next = p->next->next ;
}else{
p = p->next;
}
}
}
//输出链表
void visit(linklist l){
linklist p = l->next;
while(p != nullptr){
cout<<p->data<<" ";
p = p->next;
}
}
int main(){
int n,m;
cout<<"please input the numbers of A and B"<<endl;
cin>>n>>m;
//cout<<n<<m;
linklist A = new node;
linklist B = new node;
//构造A和B
linklist p = A,q = B;
cout<<"please input A:"<<endl;
for(int i=0;i<n;i++){
int x;
cin>>x;
linklist s = InitNode(x);
p->next = s;
p = s;
}
cout << "please input B:"<<endl;
for(int i=0;i<m;i++){
int x;
cin>>x;
linklist s = InitNode(x);
q->next = s;
q = s;
}
cout<<"A的元素是:";
visit(A);
cout<<endl;
cout<<"B的元素是:";
visit(B);
A = merge(A,B);
QuChong(A);
cout<<endl;
cout<<"A和B的交集是:";
visit(A);
}