import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* public ListNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类 the head node
* @return ListNode类
*/
public ListNode sortInList (ListNode head) {
// write code here
// 解题思路:
// 3指针 left/mid/right
// right=head.next.next 指针每次走2步,left=head 指针每次走一步
// mid=head.next指针每次走一步
// 当right指针为null时,mid在最中间,left 在mid前一个,把left.next 指为null 拆为2个链表
// 然后开始递归合并2个链表
if (head == null || head.next == null) {
return head;
}
ListNode left = head;
ListNode mid = head.next;
ListNode right = head.next.next;
while (right != null && right.next != null) {
left = left.next;
mid = mid.next;
right = right.next.next;
}
left.next = null;
return merge(sortInList(head), sortInList(mid));
}
private ListNode merge(ListNode n1, ListNode n2) {
ListNode root = new ListNode(-1);
ListNode cur = root;
while (n1 != null || n2 != null) {
if (n1 == null) {
cur.next = n2;
break;
} else if (n2 == null) {
cur.next = n1;
break;
} else {
if (n1.val < n2.val) {
cur.next = n1;
n1 = n1.next;
} else {
cur.next = n2;
n2 = n2.next;
}
}
cur = cur.next;
}
return root.next;
}
}