题目
![在这里插入图片描述](https://img-blog.csdnimg.cn/6ee4842e3dcb46c69f5ac4b01e2ec740.png#pic_center)
解答
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
int InitList_L(LinkList *L){
(*L) = (LinkList)malloc(sizeof(LNode));
if(!(*L))
exit(0);
(*L)->next = NULL;
return 1;
}
int ListInsert_L(LinkList L, int i, int e){
LinkList p, s;
int j;
p = L;
j = 0;
while(p && j<i-1){
p = p->next;
++j;
}
if(!p || j>i-1)
return 0;
s = (LinkList)malloc(sizeof(LNode));
if(!s)
exit(0);
s->data = e;
s->next = p->next;
p->next = s;
return 1;
}
int Algo_1(LinkList La, LinkList *Lb, LinkList *Lc){
LinkList pa, pb, qa, qb, s;
if(!La || !Lb || (!La->next && !(*Lb)->next))
return 0;
*Lc = La;
pa = La;
qa = La->next;
qb = (*Lb)->next;
while(qa && qb){
if(qa->data<=qb->data){
pa->next = qa;
pa = qa;
qa = qa->next;
}
else{
pa->next = qb;
pa = qb;
qb = qb->next;
}
}
while(qa){
pa->next = qa;
pa = qa;
qa = qa->next;
}
while(qb){
pa->next = qb;
pa = qb;
qb = qb->next;
}
pa->next=NULL;
free(*Lb);
return 1;
}
int Algo_2(LinkList La, LinkList *Lb, LinkList *Lc){
LinkList qa, qb, s;
if(!La || !Lb || (!La->next && !(*Lb)->next))
return 0;
*Lc = La;
qa = La->next;
qb = (*Lb)->next;
La->next = NULL;
while(qa && qb){
if(qa->data<=qb->data){
s = qa->next;
qa->next = La->next;
La->next = qa;
qa = s;
}
else{
s = qb->next;
qb->next = La->next;
La->next = qb;
qb = s;
}
}
while(qa){
s = qa->next;
qa->next = La->next;
La->next = qa;
qa = s;
}
while(qb){
s = qb->next;
qb->next = La->next;
La->next = qb;
qb = s;
}
free(*Lb);
return 1;
}
void ListTraverse(LinkList L){
if(L==NULL)
return;
else{
printf("%d ",L->data);
ListTraverse(L->next);
}
}
int main(){
LinkList La, Lb, Lc;
LinkList Ld, Le, Lf;
int i;
if(InitList_L(&La) && InitList_L(&Lb) && InitList_L(&Lc)){
for(i=1; i<=5; i++){
ListInsert_L(La, i, 2*i-1);
ListInsert_L(Lb, i, 2*i);
}
}
printf("创建好的链表为:\n");
printf("La = ");
ListTraverse(La->next);
printf("\n");
printf("Lb = ");
ListTraverse(Lb->next);
printf("\n");
Algo_1(La, &Lb, &Lc);
printf("递增归并La和Lb为Lc = ");
ListTraverse(Lc->next);
printf("\n");
if(InitList_L(&Ld) && InitList_L(&Le) && InitList_L(&Lf)){
for(i=1; i<=5; i++){
ListInsert_L(Ld, i, 2*i-1);
ListInsert_L(Le, i, 2*i);
}
}
printf("创建好的链表为:\n");
printf("Ld = ");
ListTraverse(Ld->next);
printf("\n");
printf("Le = ");
ListTraverse(Le->next);
printf("\n");
Algo_2(Ld, &Le, &Lf);
printf("递减归并Ld和Le为Lf = ");
ListTraverse(Lf->next);
printf("\n");
return 0;
}