1-7 两个有序链表序列的交集

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;
}
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

摆烂.MVP

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值