【数据结构】课后作业——求A链表与B链表的交集,保存在A链表中

P37.15

有两个递增整型链表A,B。求A链表中与B链表中元素相同的元素,保存在A链表中,其余的A中的元素删除。

(1)算法的基本设计思想

设置三个指针。一个指向A链表的结点,一个指向B链表的结点。一个指向A结点的前驱。

判断是否相等,相等则结点均往后,不相等则A大B小时B往后,A小B大时A删除。

由于已经有了之前的经验,因此该问题并不十分困难。

(2)代码如下

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
typedef int ElemType;
typedef struct LNode {
	ElemType data;
	struct LNode *next;
}LNode, *LinkList;
void printList(LinkList &L)
{
	printf("\n");
	LNode *s = L->next;
	while (s != NULL)
	{
		printf("%d ", s->data);
		s = s->next;
	}
}
LinkList CreatListend(LinkList &L)
{
	int x;
	L = (LinkList)malloc(sizeof(LNode));
	LNode *s, *r = L;
	scanf("%d", &x);
	while (x != 9999)
	{
		s = (LNode *)malloc(sizeof(LNode));
		s->data = x;
		r->next = s;
		r = s;
		scanf("%d", &x);
	}
	r->next = NULL;
	return L;
}void mergeList(LinkList &A, LinkList &B)
{
	LNode *_A,*_Apre, *_B;
	_A = A->next;
	_Apre = A;
	_B = B->next;
	while (_A != NULL&&_B!=NULL)
	{
		if (_A->data == _B->data)
		{
			_A = _A->next;
			_B = _B->next;
			_Apre = _Apre->next;
		}
		else if (_A->data > _B->data)
		{
			_B = _B->next;
		}
		else
		{
			_Apre->next = _A->next;
			free(_A);
			_A = _Apre->next;
		}
	}
	while(_A != NULL)
	{
		_Apre->next = _A->next;
		free(_A);
		_A = _Apre->next;
	}
}
void main()
{
	int count;
	LinkList A,B;
	LNode *A, *B;
	A = (LNode *)malloc(sizeof(LNode));
	B = (LNode *)malloc(sizeof(LNode));
	CreatListend(A);
	CreatListend(B);
	mergeList(A, B);
	printList(A);
}

(3)复杂度

时间复杂度O(lenA+lenB)

空间复杂度O(1)

  • 7
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值