已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3。
输入格式:
输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。
输出格式:
在一行中输出两个输入序列的交集序列,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL
。
输入样例:
1 2 5 -1
2 4 5 8 10 -1
输出样例:
2 5
注意事项:
辅助指针在需要尾插时 = 头结点
在需要遍历时 = 首元结点
建议边看边画图理解,然后再自己不看敲一遍,不要直接复制!注意思考为什么用链式结构而不是顺序结构!加油!
//没有给容量所以用链表
//升序 -1
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*Linklist;
void CreateList(Linklist head){
Linklist r = head;
int a;
scanf("%d",&a);
while(a!=-1){
LNode *p = (Linklist)malloc(sizeof(LNode));
p->data = a;
r->next = p;
r = p;
r->next = NULL;
scanf("%d",&a);
}
}
int main()
{
//初始化两个头
Linklist head1 = (Linklist)malloc(sizeof(LNode));
head1->next = NULL;
Linklist head2 = (Linklist)malloc(sizeof(LNode));
head2->next = NULL;
//创建两个链表
CreateList(head1);
CreateList(head2);
//创建两个辅助指针指向首元结点
Linklist r1 = head1->next;
Linklist r2 = head2->next;
//创建结果头3= 头1,辅助指针指向头3结点便于链接
Linklist head3 = head1;
Linklist r3 = head3;
//while循环条件为两个链表都不为空
while(r1&&r2)
{
//如果data1<data2,则链1往后走,删除刚才的结点
if(r1->data<r2->data){
LNode *p = r1;
r1=r1->next;
free(p);
}else if(r1->data>r2->data){
LNode *p = r2;
r2 = r2->next;
free(p);
}else{
//data1 = data2,链接链1的该结点,两条链都往后走,删除链2的刚才结点
r3->next = r1;
r3 = r1;
r1 = r1->next;
LNode *p = r2;
r2 = r2->next;
free(p);
}
}
free(head2);
if(head3->next == NULL)printf("NULL");
else{
int flag = 0;
r3 = head3->next;
while(r3){
if(flag == 0){
printf("%d",r3->data);
flag = 1;
}else{
printf(" %d",r3->data);
}
r3 = r3->next;
}
}
return 0;
}