https://leetcode-cn.com/problems/sort-list/submissions/
给你链表的头结点 head
,请将其按 升序 排列并返回 排序后的链表 。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode sortList(ListNode head) {
return head==null?null:mergeSort(head);
}
public ListNode mergeSort(ListNode head){
if (head.next == null){
return head;
}
ListNode tmp=head;
int length=0;
while(tmp!=null){
tmp=tmp.next;
length++;
}
ListNode res=new ListNode();
res.next=head;
for(int i=1;i<length;i<<=1){
ListNode current=res.next;
ListNode data=res;
while(current!=null){
ListNode left=current;
int count=1;
while(current!=null&&count<i){
current=current.next;
count++;
}
ListNode right=current;
if(current!=null){
tmp=current.next;
current.next=null;
current=tmp;
right=current;
count=1;
while(current!=null&&count<i){
current=current.next;
count++;
}
if(current!=null){
tmp=current.next;
current.next=null;
current=tmp;
}
}
ListNode sortedNode=merge(left,right);
while(sortedNode!=null){
data.next=sortedNode;
sortedNode=sortedNode.next;
data=data.next;
}
}
}
return res.next;
}
public ListNode merge(ListNode left,ListNode right){
ListNode head=new ListNode(0);
ListNode current=head;
while(left!=null&&right!=null){
if(left.val<right.val){
current.next=left;
current=current.next;
left=left.next;
}else{
current.next=right;
current=current.next;
right=right.next;
}
}
if(left==null){
current.next=right;
}
if(right==null){
current.next=left;
}
return head.next;
}
}