题目描述:
输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。
输入
第一行输入一个数字T表示样例个数。
对于每个样例,第一行输入两个数字m, n,分别表示两个链表的长度
第二行输入m个数字,表示第一个链表
第三行输入n个数字,表示第二个链表
输出
对于每一组样例,输出 m + n个数表示合并结果。
样例输入
2
2 2
1 2
3 4
3 2
3 4 5
1 4
样例输出
1 2 3 4
1 3 4 4 5
提示
m + n <= 1000
#include <iostream>
#include <stdlib.h>
using namespace std;
typedef struct node
{
int data;
struct node *link;
}Nnode;
Nnode* CreatListR(int m)//尾插法创建带有头结点的单链表
{
Nnode* head=(Nnode*)malloc(sizeof(Nnode));
head->link=NULL;
Nnode*q,*r=head;
for(int i=0;i<m;i++)
{
q=(Nnode*)malloc(sizeof(Nnode));
cin>>q->data;
q->link=r->link;
r->link=q;
r=q;
}
return head;
}
Nnode* MergeList(Nnode* node1,Nnode* node2)//按递增顺序合并两个单链表为不带头结点的单链表
{
Nnode* head,*p=node1->link,*q=node2->link;
if(p->data<=q->data)
{
head=p;
p=p->link;
}
else
{
head=q;
q=q->link;
}
Nnode *r=head;
while(p&&q)
{
if(p->data<=q->data)
{
r->link=p;
p=p->link;
r=r->link;
}
else
{
r->link=q;
q=q->link;
r=r->link;
}
}
if(p)
{
r->link=p;
}
if(q)
{
r->link=q;
}
return head;
}
int main()
{
int T,m,n;
Nnode *node1,*node2,*head,*p;
cin>>T;
while(T--)
{
cin>>m>>n;
node1=CreatListR(m);
node2=CreatListR(n);
head=MergeList(node1,node2);
p=head;
cout<<p->data;
while(p->link)
{
cout<<" "<<p->link->data;
p=p->link;
}
cout<<endl;
}
return 0;
}