原题链接
这道题的要点分别有:
- 插入的时候函数返回最后一个结点的指针,下次插入直接就不用从头数到尾了,对大量数据插入有很大的帮助。
- 合并时,两个链表插入较小的那一个,如果有一个链表结束了,那么退出循环,将没有结束的链表直接插到新链表的最后面。这个操作对大数据量也很有帮助。
因为这道题是有序的链表且要不减输出,所以我们在给出交集的时侯可以做如下判断
- 如果L1链当前的结点小于L2链的当前结点,L1链当前结点指向它的下一个结点。
- 如果L2链当前的结点小于L1链的当前结点,L2链当前结点指向它的下一个结点。
- 如果L1链的当前结点和L2链的当前结点相等,L3链的下一个结点为L1或L2当前结点的任意一个,P1,P2,P3同时指向他们的下一个结点。
#include <stdio.h>
#include <stdlib.h>
typedef struct node{
struct node* next;
int data;
}lnode;
void init(lnode **l){
(*l)=(lnode *)malloc(sizeof(lnode));
(*l)->next=NULL;
}
lnode* insert(lnode *l,lnode *p,int a){
lnode *q;
q=(lnode *)malloc(sizeof(lnode));
q->next=NULL;
q->data=a;
p->next=q;
return q;
}
void pp(lnode *l){
lnode *p=l->next;
if(p==NULL){
printf("NULL");
return;
}
while(p!=NULL){
if(p->next==NULL){
printf("%d",p->data);
}else{
printf("%d ",p->data);
}
p=p->next;
}
}
void jj(lnode *l1,lnode *l2,lnode *l3){
lnode *p1=l1->next,*p2=l2->next,*p3=l3;
while(p1!=NULL && p2!=NULL){
if(p1->data<p2->data){
p1=p1->next;
}else if(p1->data>p2->data){
p2=p2->next;
}else{
p3->next=p1;
p1=p1->next;
p2=p2->next;
p3=p3->next;
}
}
}
int main(){
lnode *l1,*l2,*l3,*p;
init(&l1);
init(&l2);
init(&l3);
p=l1;
int a;
scanf("%d",&a);
while(a!=-1){
p=insert(l1,p,a);
scanf("%d",&a);
}
scanf("%d",&a);
p=l2;
while(a!=-1){
p=insert(l2,p,a);
scanf("%d",&a);
}
jj(l1,l2,l3);
pp(l3);
}