148.链表排序
题解:根据快慢指针取到链表中点的结点,然后一直递归二分,二分完之后,进行合并,合并的时候
小的放前面,大的放后面,最后需要判断一下有没有合并完成,有可能是左边合并完了,右边还有没合
并的,类似这样,判断一下,最后接上就好了。
class Solution {
public ListNode sortList(ListNode head) {
return mergeSort(head);
}
public ListNode mergeSort(ListNode head) {
if (head == null||head.next==null) {
return head;
}
//快慢指针取中点
ListNode fastNode = head.next, slowNode = head;
while (fastNode != null && fastNode.next != null) {
fastNode = fastNode.next.next;
slowNode = slowNode.next;
}
ListNode temp=slowNode.next;
slowNode.next=null;
//二分左边和右边
ListNode leftNode=mergeSort(head);
ListNode rightNode=mergeSort(temp);
ListNode root=new ListNode(-1);
ListNode curNode=root;
//进行合并,小的放前面,大的放后面
while(leftNode!=null&&rightNode!=null){
if(leftNode.val< rightNode.val){
curNode.next=leftNode;
leftNode=leftNode.next;
}else{
curNode.next=rightNode;
rightNode=rightNode.next;
}
curNode=curNode.next;
}
//判断是否合并完,直接接上
curNode.next=leftNode==null?rightNode:leftNode;
return root.next;
}
}