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)