问题描述
使用带头结点的单链表编程:
有两个有序序列,分别表示两个集合。
求它们的交集并输出。
注意:这里要利用到“有序”的特性。
输入说明
第一行输入序列A的信息:
第一个整数n(0<=n<=100),表示共有n个元素,其后有n个整数,表示n个元素的数据
第一行输入序列B的信息:
第一个整数n(0<=n<=100),表示共有n个元素,其后有n个整数,表示n个元素的数据
注:两个序列输入时保证有序
输出说明
输出交集的元素序列,输出格式见范例。
如果交集为空,则输出“head-->tail”
#include<iostream>
#include<cmath>
using namespace std;
struct ListNode
{
int val;
ListNode *next;
ListNode() : val(0), next(NULL) {}
ListNode(int x) : val(x), next(NULL) {}
ListNode(int x, ListNode *next) : val(x), next(next) {}
};
ListNode* createByTail(int len)
{
ListNode *head = nullptr, *p2 = nullptr;
int num;
for (int n = 0; n < len && cin >> num; ++n)
{
ListNode* p1 = new ListNode(num);
if (head == nullptr)
{
head = p1; // 正确设置头节点
}
else
{
p2->next = p1;
}
p2 = p1;
}
return head;
}
ListNode *AddByTail(ListNode*head,int num)
{
ListNode*p1=new ListNode(num);
if(head==nullptr)
return p1;
ListNode*temp=head;
while(temp->next!=nullptr)
temp=temp->next;
temp->next=p1;
return head;
}
ListNode* Intersection(ListNode*head1,ListNode*head2)
{
ListNode*head3=nullptr;
if(head1==nullptr||head2==nullptr) return head3;
for (ListNode* p1 = head1; p1 != nullptr; p1 = p1->next)
{
for (ListNode* p2 = head2; p2 != nullptr; p2 = p2->next)
{
if (p1->val == p2->val)
{
head3 = AddByTail(head3, p1->val);
break; // Avoids adding duplicates
}
}
}
return head3;
}
void print(ListNode*head)
{
cout<<"head-->";
ListNode*temp=head;
while(temp)
{
cout<<temp->val<<"-->";
temp=temp->next;
}
cout<<"tail"<<endl;
}
int main()
{
int len1,len2;
cin>>len1;
ListNode*A=createByTail(len1);
cin>>len2;
ListNode*B=createByTail(len2);
ListNode*C=Intersection(A,B);
print(C);
return 0;
}