#include<iostream>
#include<stdio.h>
using namespace std;
typedef struct lnode{
int data;
struct lnode * next;
}node;
void createLink(node *&head)
{
int x;
node * p = head;
while (scanf("%d", &x) != EOF)
{
node * q = new node;
q->data = x;
if (head == NULL)
{
head = q;
head->next = NULL;
p = head;
}
else
{
q->next = p->next;
p->next = q;
p = q;
}
}
}
void output(node * head)
{
node * p = head;
while(p != NULL)
{
cout<<p->data<<" ";
p = p->next;
}
}
//non-recursive merge two sorted link into one sorted link
node * mergeLink1(node * head1, node * head2)
{
if (head1 == NULL)
return head2;
if (head2 == NULL)
return head1;
node *p1, *p2, *p3, *newhead;
p1 = head1;
p2 = head2;
if (p1->data > p2->data)
{
newhead = p2;
p2 = p2->next;
}
else
{
newhead = p1;
p1 = p1->next;
}
p3 = newhead;
while (p1 != NULL && p2 != NULL)
{
if (p1->data > p2->data)
{
p3->next = p2;
p2 = p2->next;
p3 = p3->next;
}
else
{
p3->next = p1;
p1 = p1->next;
p3 = p3->next;
}
}
if (p1 != NULL)
{
p3->next = p1;
}
else if (p2 != NULL)
{
p3->next = p2;
}
else
{
p3->next = NULL;
}
return newhead;
}
//recursive merge two sorted link into one sorted link
node * mergeLink2(node * head1, node * head2)
{
node * head = NULL;
if (head1 == NULL)
{
return head2;
}
if (head2 == NULL)
{
return head1;
}
if (head1->data <= head2->data)
{
head = head1;
head->next = mergeLink2(head1->next, head2);
}
else
{
head = head2;
head->next = mergeLink2(head1, head2->next);
}
return head;
}
int main(void)
{
node * head1 = NULL;
node * head2 = NULL;
node * newhead = NULL;
createLink(head1);
createLink(head2);
// newhead = mergeLink1(head1, head2);
newhead = mergeLink2(head1, head2);
output(newhead);
}