1-7 两个有序链表序列的交集 (20分)
已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3。
输入格式:
输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。
输出格式:
在一行中输出两个输入序列的交集序列,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL。
输入样例:
1 2 5 -1
2 4 5 8 10 -1
输出样例:
2 5
无头节点的链表
#include <stdio.h>
#include <stdlib.h>
typedef struct link {
int date;
struct link *next;
}*List,Link;
List build() {
List L;
Link *p,*s;
int x;
L=(List)malloc(sizeof(Link));
L->next=NULL;
s=L;
scanf("%d",&x);
while(x>0) {
p=(Link *)malloc(sizeof(Link));
p->date=x;
p->next=NULL;
s->next=p;
s=p;
scanf("%d",&x);
}
return L;
}
List operate(List S1,List S2) {
Link *a,*b,*t,*s;
List S3=(Link *)malloc(sizeof(Link));
S3->next=NULL;
a=S1->next;
b=S2->next;
t=S3;
while(a&&b) { //这里的比较方法我改了,然后通过了
if(a->date>b->date)
b=b->next;
else if(a->date<b->date)
a=a->next;
else {
s=(Link *)malloc(sizeof(Link));
s->date=a->date;
s->next=NULL;
a=a->next;
b=b->next;
t->next=s;
t=s;
}
}
return S3;
}
int main () {
List S1,S2,S3;
Link *p;
S1=build();
S2=build();
S3=operate(S1,S2);
if(S3->next==NULL)
printf("NULL");
p=S3->next;
while(p) {
if(p->next==NULL)
printf("%d",p->date);
else
printf("%d ",p->date);
p=p->next;
}
return 0;
}
有头节点的链表
#include <stdio.h>
#include <stdlib.h>
typedef struct link
{
int date;
struct link *next;
}*List,Link;
List build()
{
List L;
Link *p,*s;
int x;
L=(List)malloc(sizeof(Link));
L->next=NULL;
s=L;
while(1)
{
scanf("%d",&x);
if(x==-1)
break;
p=(Link *)malloc(sizeof(Link));
p->date=x;
p->next=NULL;
s->next=p;
s=p;
}
s->next=NULL;
return L;
}
List operate(List S1,List S2)
{
Link *a,*b,*t,*s;
List S3;
S3=(Link *)malloc(sizeof(Link));
S3->next=NULL;
a=S1->next;
b=S2->next;
t=S3;
while(a&&b)//这里的比较方法我改了,然后通过了
{
if(a->date>b->date)
b=b->next;
else if(a->date<b->date)
a=a->next;
else if(a->date==b->date)
{
s=(Link *)malloc(sizeof(Link));
s->date=a->date;
s->next=NULL;
t->next=s;
t=s;
a=a->next;
b=b->next;
}
}
t->next=NULL;
return S3;
}
int main ()
{
List S1,S2,S3;
Link *p;
S1=build();
S2=build();
S3=operate(S1,S2);
if(S3->next==NULL)
printf("NULL");
p=S3->next;
while(p)
{
if(p->next==NULL)
printf("%d",p->date);
else
printf("%d ",p->date);
p=p->next;
}
return 0;
}
一种比较低效的方法,不可用
这种查找比较慢,比较耗时,所以最后怎么更改都是超时的。
List operate(List S1,List S2) {
Link *p,*s,*t,*a;
List S3=(Link *)malloc(sizeof(Link));
S3->next=NULL;
p=S1->next;
s=S2->next;
t=S3;
//一种比较笨的方法
while(p) {
s=S2->next;
while(s) {
if(p->date==s->date) {
a=(List)malloc(sizeof(Link));
a->date=p->date;//复制数值,而不是把整个节点拿过来
a->next=NULL;
t->next=a;
t=a;
}
s=s->next;
}
p=p->next;
}
return S3;
}
数组【×】
大规模的数据还是不能通过,最大只能把数组给开到999999,但这样子都不可以,还是老老实实的用链表吧
这本来就是链表的题目,自己想着投机取巧,换个简单的方法,但是这题目的测试点真的是硬核了。
#include<iostream>
using namespace std;
#define MAX 999999
int main() {
int a[MAX],b[MAX];
int x,y;
int i=0,j=0;
int cnt=0;
while(cin>>x&&x>-1) {//必须写x>-1,不能写等于
a[i++]=x;
}
while(cin>>y&&y>-1) {
b[j++]=y;
}
int m=0,n=0;
int pp=0;
while(m<i&&n<j) {
if(a[m]<b[n])
m++;
else if(a[m]>b[n])
n++;
else {
if(cnt++)
cout<<" ";
cout<<a[m];
m++;
n++;
pp++;
}
}
if(pp==0)
cout<<"NULL";
return 0;
}
这个是后来写的,出现了小错误,以后不要在犯了
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node* next;
}*list,node;
list creat() {
list a,p,s;
a=(list)malloc(sizeof(node));
a->next=NULL;
s=a;
int x;
scanf("%d",&x);
while(x>-1) {
p=(list)malloc(sizeof(node));
p->data=x;
p->next=NULL;
s->next=p;
s=p;
scanf("%d",&x);//这个非常的重要,不要忘了
}
return a;
}
void operate(list a,list b) {
a=a->next;
b=b->next;
int cnt=0;
while(a&&b) {
if(a->data<b->data)
a=a->next;
else if(a->data>b->data)
b=b->next;
else {
if(cnt++)
printf(" ");
printf("%d",a->data);
a=a->next;
b=b->next;
}
}
if(cnt==0)
printf("NULL");//不要忘了啊
}
int main() {
list a,b;
a=creat();
b=creat();
operate(a,b);
return 0;
}