原题链接
这里用到了两个小技巧
- 插入的时候函数返回最后一个结点的指针,下次插入直接就不用从头数到尾了,对大量数据插入有很大的帮助。
- 合并时,两个链表插入较小的那一个,如果有一个链表结束了,那么退出循环,将没有结束的链表直接插到新链表的最后面。这个操作对大数据量也很有帮助。
#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 hb(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){
p3->next=p1;
p1=p1->next;
p3=p3->next;
}else{
p3->next=p2;
p2=p2->next;
p3=p3->next;
}
}
if(p1==NULL){
p3->next=p2;
}else{
p3->next=p1;
}
}
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);
}
hb(l1,l2,l3);
pp(l3);
}