【问题描述】假设两个带头结点的非递减有序单链表,头指针分别为La和Lb,现归并La和Lb得到一个非递增的有序单
链表,用La作为该新单链表的头指针.在编程过程中,不能增加新结点,只能以La和Lb中的结点为基础,通过调整指针
得到非递增的有序单链表.
【样例输入】2 4 8 10 20 25 30 40 100 -1
1 2 2 4 27 -1
【样例输出】100 40 30 27 25 20 10 8 4 4 2 2 2 1
/*2 4 8 10 20 25 30 40 100 -1
1 2 2 4 27 -1
<output>100,40,30,27,25,20,10,8,4,4,2,2,2,1</output>
1 3 5 7 -1
2 4 6 6 8 11 13 15 -1
<output>15 13 11 8 7 6 6 5 4 3 2 1</output>
2 4 8 10 20 25 30 40 100 -1
1 2 2 4 27 -1
<output>100 40 30 27 25 20 10 8 4 4 2 2 2 1</output>
1 -1
2 4 6 8 10 12 -1
<output>12 10 8 6 4 2 1</output>
2 4 6 8 10 12 -1
1 -1
<output>12 10 8 6 4 2 1</output>
1 1 2 3 5 7 -1
2 2 2 2 2 2 -1
<output>7 5 3 2 2 2 2 2 2 2 1 1</output>
*/
#include<stdio.h>
#include<malloc.h>
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*Linklist;
void creatlist(Linklist &l)
{
Linklist p,q;
l=(Linklist)malloc(sizeof(LNode));
l->next=NULL;
p=l;
while(1)
{
q=(Linklist)malloc(sizeof(LNode));
q->next=NULL;
scanf("%d",&q->data);
if(q->data<0)
break;
p->next=q;
p=q;
}
}
void print(Linklist l)
{
Linklist p;
p=l->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
}
void mergelist(Linklist &la,Linklist &lb,Linklist &l)
{
/*
pre是中间指针
pre代替一下
pa/pb头插进去
pa/pb“++”
*/
Linklist pa,pb,pre;
pa=la->next;
pb=lb->next;
l=la;
la->next=NULL;
while(pa&&pb)
{
if(pa->data<=pb->data)
{
pre=pa->next;
pa->next=la->next;
la->next=pa;
pa=pre;
}
else
{
pre=pb->next;
pb->next=la->next;
la->next=pb;
pb=pre;
}
}
while(pa)
{
pre=pa->next;
pa->next=la->next;
la->next=pa;
pa=pre;
}
while(pb)
{
pre=pb->next;
pb->next=la->next;
la->next=pb;
pb=pre;
}
free(lb);
}
int main()
{
Linklist A,B,t;
creatlist(A);
creatlist(B);
mergelist(A,B,t);
print(t);
return 0;
}