using
System;
public
class
Node
{
public
int
data;
public
Node next;
public
Node(
int
x)
{
data = x;
next =
null
;
}
}
public
class
LinkedListMergeSort
{
public
Node Merge(Node firstNode, Node secondNode)
{
Node merged =
new
Node(-1);
Node temp =
new
Node(-1);
merged = temp;
while
(firstNode !=
null
&& secondNode !=
null
)
{
if
(firstNode.data <= secondNode.data)
{
temp.next = firstNode;
firstNode = firstNode.next;
}
else
{
temp.next = secondNode;
secondNode = secondNode.next;
}
temp = temp.next;
}
while
(firstNode !=
null
)
{
temp.next = firstNode;
firstNode = firstNode.next;
temp = temp.next;
}
while
(secondNode !=
null
)
{
temp.next = secondNode;
secondNode = secondNode.next;
temp = temp.next;
}
return
merged.next;
}
public
Node Middle(Node head)
{
Node slow = head;
Node fast = head?.next;
while
(slow?.next !=
null
&& (fast !=
null
&& fast.next !=
null
))
{
slow = slow.next;
fast = fast.next.next;
}
return
slow;
}
public
Node MergeSort(Node head)
{
if
(head?.next ==
null
)
{
return
head;
}
Node mid =
new
Node(-1);
Node head2 =
new
Node(-1);
mid = Middle(head);
head2 = mid?.next;
mid.next =
null
;
Node finalhead = Merge(MergeSort(head), MergeSort(head2));
return
finalhead;
}
public
Node RearrangeWithPeaks(Node head)
{
int
cnt = 1;
Node temp = head;
while
(temp?.next !=
null
)
{
if
(cnt % 2 == 0)
{
int
tempData = temp.data;
temp.data = temp.next.data;
temp.next.data = tempData;
}
temp = temp.next;
cnt++;
}
return
head;
}
public
void
PrintList(Node node)
{
while
(node !=
null
)
{
Console.Write(node.data +
" "
);
node = node.next;
}
Console.WriteLine();
}
public
static
void
Main(
string
[] args)
{
LinkedListMergeSort l =
new
LinkedListMergeSort();
Node head =
new
Node(1);
head.next =
new
Node(2);
head.next.next =
new
Node(3);
head.next.next.next =
new
Node(4);
head.next.next.next.next =
new
Node(5);
Console.Write(
"Before rearranging: "
);
l.PrintList(head);
head = l.MergeSort(head);
Console.Write(
"After rearranging: "
);
l.RearrangeWithPeaks(head);
l.PrintList(head);
}
}