#include<iostream>
using namespace std;
typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {
ElementType Data;
PtrToNode Next;
};
typedef PtrToNode List;
List Read()
{
int n,i,j;
cin>>n;
List l,p,r;
l=(List)malloc(sizeof(struct Node));
l->Next=NULL;
r=l; //见最下面分析
for(i=0;i<n;i++)
{
cin>>j;
p=(List)malloc(sizeof(struct Node));
p->Data=j;
r->Next=p;
r=r->Next; //r始终只想尾结点
}
r->Next=NULL;
return l;
}
void Print( List L )
{
List p;
p=L->Next;
if(p==NULL)
cout<<"NULL";
while(p!=NULL)
{
cout<<p->Data<<" ";
p=p->Next;
}
cout<<endl;
}
List Merge( List L1, List L2 )
{
List p=L1->Next,q=L2->Next,L,l;
L=(List)malloc(sizeof(struct Node));
L->Next=NULL;
l=L; //见最下面分析
while(p!=NULL&&q!=NULL)
{
if(p->Data<q->Data) {
l->Next=p;
l=p; //l始终指向尾结点
p=p->Next;
}
else {
l->Next=q;
l=q;
q=q->Next;
}
}
if(p==NULL&&q==NULL) return L;
l->Next = p? p:q;
L1->Next = NULL;
L2->Next = NULL;
return L;
}
int main()
{
List L1, L2, L;
L1 = Read();
L2 = Read();
L = Merge(L1, L2);
Print(L);
Print(L1);
Print(L2);
return 0;
}
//19,47:我之前一直没写这行,然后输出一直是null。因为l是头结点,
//到最后我肯定是要返回头结点的,但是如果一直l=l->next,那么最后返回的就是尾结点,而我一般都将尾结点置null
//所以要用r始终指向尾结点,初始时指向头结点 ,最后将尾结点的next域置为0;