Sort a linked list in
O(
n log
n) time using constant space complexity.
/* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
* */
public class Sort_list {
public ListNode sortList(ListNode head) {
if(head == null||head.next == null){
return head;
}
ListNode mid = getMid(head);
ListNode midnext = mid.next;
mid.next = null;//将链表分成两个部分,head-fast;slow-链表最后节点
return mergeSort(sortList(head), sortList(midnext));//先分后并
}
public ListNode getMid(ListNode head){
if(head == null||head.next==null){
return head;
}
ListNode fast = head;
ListNode slow = head;
while(fast!=null&&fast.next!=null&&fast.next.next!=null){
fast = fast.next.next;
slow = slow.next;
}
return slow;
}
public ListNode mergeSort(ListNode n1,ListNode n2){
ListNode preHead = new ListNode(0);//新建一个头节点
ListNode cur1 = n1;
ListNode cur2 = n2;
ListNode cur = preHead;
while (cur1 != null && cur2 != null) {
if (cur1.val < cur2.val) {
cur.next = cur1;
cur1 = cur1.next;
}else {
cur.next = cur2;
cur2 = cur2.next;
}
cur = cur.next;
}
cur.next = cur1 == null?cur2:cur1;
return preHead.next;
}
}
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
* */
public class Sort_list {
public ListNode sortList(ListNode head) {
if(head == null||head.next == null){
return head;
}
ListNode mid = getMid(head);
ListNode midnext = mid.next;
mid.next = null;//将链表分成两个部分,head-fast;slow-链表最后节点
return mergeSort(sortList(head), sortList(midnext));//先分后并
}
public ListNode getMid(ListNode head){
if(head == null||head.next==null){
return head;
}
ListNode fast = head;
ListNode slow = head;
while(fast!=null&&fast.next!=null&&fast.next.next!=null){
fast = fast.next.next;
slow = slow.next;
}
return slow;
}
public ListNode mergeSort(ListNode n1,ListNode n2){
ListNode preHead = new ListNode(0);//新建一个头节点
ListNode cur1 = n1;
ListNode cur2 = n2;
ListNode cur = preHead;
while (cur1 != null && cur2 != null) {
if (cur1.val < cur2.val) {
cur.next = cur1;
cur1 = cur1.next;
}else {
cur.next = cur2;
cur2 = cur2.next;
}
cur = cur.next;
}
cur.next = cur1 == null?cur2:cur1;
return preHead.next;
}
}