题目简述:
解析:
首先能想到的是,找出A和B中所有重复的元素,然后遍历C删去。但这种方法的时间复杂度是O(mn),即双层遍历A和B所有元素。
结合题意,给出的A和B都是递增有序的表,则可以同时遍历,然后根据当前数据大小一起移动指针,这样时间复杂度只有O( max(m, n) )。
重点:
掌握遍历有序表的更快速的方法。
代码:
#include <iostream>
using namespace std;
struct LinkNode{
int value;
LinkNode *next;
};
void Create_LinkList(LinkNode *head,int n)
{
LinkNode *p=head;
for(int i=0;i<n;i++)
{
int tmp;
cin>>tmp;
LinkNode *node=new LinkNode;
node->value=tmp;
node->next=NULL;
p->next=node;
p=node;
}
}
void Delete_Repete(LinkNode *headA,LinkNode *headB,LinkNode *headC)
{
//找出重复元素,存进a数组
int len=0,a[101];
LinkNode *pa=headA->next,*pb=headB->next;
while(pa!=NULL&&pb!=NULL)
{
if(pa->value==pb->value)
{
a[len++]=pa->value;
pa=pa->next;
pb=pb->next;
}
else if(pa->value>pb->value)
pb=pb->next;
else
pa=pa->next;
}
//删除重复元素
int i=0;
LinkNode *pc=headC;
while(pc->next!=NULL&&i<len)
{
if(pc->next->value==a[i])
{
pc->next=pc->next->next;
pc=pc->next;
//此处注意,i不能i++,因为可能有多个相同元素
}
else if(pc->next->value>a[i])
i++;
else
pc=pc->next;
}
}
int main()
{
int lenA,lenB,lenC;
cin>>lenA>>lenB>>lenC;
//创建三个链表的头节点,都赋为NULL
LinkNode *headA=NULL,*headB=NULL,*headC=NULL;
headA=new LinkNode;
headA->next=NULL;
headB=new LinkNode;
headB->next=NULL;
headC=new LinkNode;
headC->next=NULL;
//创建三个链表
Create_LinkList(headA,lenA);
Create_LinkList(headB,lenB);
Create_LinkList(headC,lenC);
//删除重复元素
Delete_Repete(headA,headB,headC);
LinkNode *pc=headC->next;
while(pc!=NULL)
{
cout<<pc->value<<" ";
pc=pc->next;
}
return 0;
}