import java.util.*;
public class Solution {
public ListNode sortInList (ListNode head) {
// write code here
if(head == null || head.next == null)
return head;
ListNode fast = head.next,p = head;
while(fast != null && fast.next != null ){
p = p.next;
fast = fast.next.next;
}
ListNode lt = p.next;
p.next = null;
ListNode l1 = sortInList(head);
ListNode l2 = sortInList(lt);
return merge(l1,l2);
}
ListNode merge(ListNode l1 , ListNode l2){
if(l1 == null){
return l2;
}
if(l2 == null){
return l1;
}
ListNode head;
if(l1.val <= l2.val){
head = l1;
l1 = l1.next;
}
else{
head = l2;
l2 = l2.next;
}
ListNode p = head;
while(l1 != null && l2 != null){
if(l1.val < l2.val){
p.next = l1;
l1 = l1.next;
}else{
p.next = l2;
l2 = l2.next;
}
p = p.next;
}
if(l1 != null){
p.next = l1;
}
if(l2 != null){
p.next = l2;
}
return head;
}
}