求两个有序链表的交集和并集(不开辟新的空间)
链表的相关基本操作
#include<stdio.h>
#include<stdlib.h>
typedef int Elemtype;
typedef struct LNode{
Elemtype data;
struct LNode* next;
}LNode;
LNode* Createlist(int length)//尾插法创建链表
{
LNode* L=(LNode*)malloc(sizeof(LNode));
L->next=NULL;
LNode* t=L;
for(int i=1;i<=length;i++)
{
LNode* p=(LNode*)malloc(sizeof(LNode));
p->next=NULL;
scanf("%d",&p->data);
t->next=p;
t=p;
}
return L;
}
void scan(LNode* L)//遍历链表
{
LNode* p=L->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
求交集
LNode* merge(LNode* la,LNode* lb)
{
LNode* p=la;
LNode* pa=la->next,*pb=lb->next,*t;
la->next=NULL;//头节点断开
while(pa&&pb)
{
if(pa->data<pb->data) pa=pa->next;
else if(pa->data>pb->data) pb=pb->next;
else //如果相等,则取其中一个放在la中即可
{
t=pa;
pa=pa->next;
t->next=p->next;
p->next=t;
p=t;
}
}
return la;
}
求并集
LNode* combine(LNode* la,LNode* lb)
{
LNode* pa=la->next;
LNode* pb=lb->next;
LNode* t;
LNode* q=la;
la->next=NULL;
while(pa&&pb)
{
if(pa->data<pb->data)
{
t=pa;
pa=pa->next;
t->next=q->next;
q->next=t;
q=t;
}
else if(pa->data>pb->data)
{
t=pb;
pb=pb->next;
t->next=q->next;
q->next=t;
q=t;
}
else if(pa->data==pb->data)
{
t=pa;
pa=pa->next;
pb=pb->next; //相较于第一个条件,只多了一个pb后移
t->next=q->next;
q->next=t;
q=t;
}
}
if(pa) q->next=pa;//将剩下的连接到新的链表后面
if(pb) q->next=pb;
return la;
}