7-16 两个有序链表序列的交集(20 分)
已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3。
输入格式:
输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。
输出格式:
在一行中输出两个输入序列的交集序列,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL
。
输入样例:
1 2 5 -1
2 4 5 8 10 -1
输出样例:
2 5 这个用数组模拟过不了 code:
#include <stdio.h> #include <string.h> #include <stdlib.h> //一个开始用数组最后一个点总是过不了,就老实写链表了 struct Node{ int Data; struct Node* Next; };//链表结构体 typedef struct Node* List; //创建一个链表 List Creat(){ List head = (List)malloc(sizeof(struct Node)),q; head->Next = NULL; q = head;//创建头结点的链表 int x; while(~scanf("%d",&x)&&x!=-1){ List p = (List)malloc(sizeof(struct Node)); p->Data = x; p->Next = NULL;//赋值操作 q->Next = p;//前一个的下一个为新创建的结点 q = p;//尾指针指向最后一个 } return head; } //求交集 List Merge(List a,List b){ a = a->Next; b = b->Next;//分别指向第一个有效结点 //创建交集链表的表头 List head = (List)malloc(sizeof(struct Node)); head->Next = NULL; List q = head; while(a&&b){ if(a==NULL||a->Data > b->Data){ b = b->Next;//如果a为空,或者a比b大,a不能移动了,b往后移找更大的 } else if(b==NULL||b->Data > a->Data){ a = a->Next;//同理 } else{//相同创建新的交集链表 List p = (List)malloc(sizeof(struct Node)); p->Data = b->Data; p->Next = NULL; q->Next = p; q = p; a = a->Next; b = b->Next;//同时移动到下一个 } } return head; } //打印链表 void printList(List a){ a = a->Next; if(a==NULL){//为空输出NULL; printf("NULL\n"); return; } int flag = 0; while(a!=NULL){ if(!flag)printf("%d",a->Data); else printf(" %d",a->Data); flag = 1; a = a->Next;//移动下一个,老是忘。。。。 } puts(""); return; } int main(){ List a = Creat(); List b = Creat(); List c = Merge(a,b); printList(c); return 0; }