#include<bits/stdc++.h>
using namespace std;
struct ListNode
{
int value;
ListNode* next;
};
typedef struct ListNode ListNode;
ListNode* head = NULL;
ListNode* tail = head;
void append(int value)
{
if(head)
{
ListNode* temp = new ListNode();
temp->value = value;
temp->next = NULL;
tail->next = temp;
tail = tail->next;
}
else
{
head = new ListNode();
head->value = value;
head->next = NULL;
tail = head;
}
}
ListNode* middle()
{
if(head==NULL || head->next==NULL)
return head;
ListNode* fast = head;
ListNode* slow = head;
while(fast->next!=NULL && fast->next->next!=NULL)
{
slow = slow->next;
fast = fast->next->next;
}
return slow;
}
ListNode* middle(ListNode* left, ListNode* right)
{
ListNode* fast = left;
ListNode* slow = left;
while(fast->next!=right->next && fast->next->next!=right->next)
{
slow = slow->next;
fast = fast->next->next;
}
return slow;
}
void printList()
{
ListNode* temp = head;
while(temp)
{
cout << temp->value << " ";
temp = temp->next;
}
cout << endl;
}
void printList(ListNode* head, ListNode* tail)
{
ListNode* temp = head;
while(temp!=tail->next)
{
cout << temp->value << " ";
temp = temp->next;
}
cout << endl;
}
const int INF = 0x7f7f7f7f;
void Merge(ListNode* left, ListNode* mid, ListNode* right)
{
// creating Left auxiliary List
ListNode* LeftHead = NULL;
ListNode* LeftTail = NULL;
ListNode* leftIterator = left;
while(leftIterator!=mid->next)
{
if(LeftHead==NULL)
{
LeftHead = new ListNode();
LeftHead->value = leftIterator->value;
LeftHead->next = NULL;
LeftTail = LeftHead;
}
else
{
ListNode* temp = new ListNode();
temp->value = leftIterator->value;
temp->next = NULL;
LeftTail->next = temp;
LeftTail = LeftTail->next;
}
leftIterator = leftIterator->next;
}
ListNode* temp = new ListNode();
temp->value = INF;
temp->next = NULL;
LeftTail->next = temp;
LeftTail = LeftTail->next;
// creating Right auxiliary List
ListNode* RightHead = NULL;
ListNode* RightTail = NULL;
ListNode* rightIterator = mid->next;
while(rightIterator!=right->next)
{
if(RightHead==NULL)
{
RightHead = new ListNode();
RightHead->value = rightIterator->value;
RightHead->next = NULL;
RightTail = RightHead;
}
else
{
ListNode* temp = new ListNode();
temp->value = rightIterator->value;
temp->next = NULL;
RightTail->next = temp;
RightTail = RightTail->next;
}
rightIterator = rightIterator->next;
}
temp = new ListNode();
temp->value = INF;
temp->next = NULL;
RightTail->next = temp;
RightTail = RightTail->next;
leftIterator = LeftHead;
rightIterator = RightHead;
ListNode* temporaryHead = left;
ListNode* temporaryEnd = right;
while(left!=right->next)
{
if(leftIterator->value<rightIterator->value)
{
left->value = leftIterator->value;
leftIterator = leftIterator->next;
}
else
{
left->value = rightIterator->value;
rightIterator = rightIterator->next;
}
left = left->next;
}
return;
}
void Msort(ListNode* left, ListNode* right)
{
if(left!=right)
{
ListNode* mid = middle(left, right);
Msort(left, mid);
Msort(mid->next, right);
Merge(left, mid, right);
}
}
void deleteList()
{
while(head)
{
ListNode* temp = head;
head = head->next;
delete(temp);
}
return;
}
int main()
{
#ifdef TarekHasan
freopen("input.txt", "r", stdin);
#endif // TarekHasan
int n; cin >> n;
while(n--)
{
int temp; cin >> temp;
append(temp);
}
printList();
Msort(head, tail);
printList();
deleteList();
return 0;
}