给你链表的头结点 head
,请将其按 升序 排列并返回 排序后的链表 。
输入:head = [4,2,1,3] 输出:[1,2,3,4]
思路一:可以使用插入排序(请看我主页的另一篇《Java中等题-对链表进行插入排序》)
思路二:使用归并排序:把链表分成两个链表,分别排序,然后合并(这个方法我不会,所以我借鉴的力扣某大佬写的)
class Solution {
public ListNode sortList(ListNode head) {
if(head==null||head.next==null){ //如果链表为空或者只有一个数,那就直接返回
return head;
}
ListNode slow=head,fast=head;
while(fast.next!=null&&fast.next.next!=null){//使用快慢指针法找到中点
fast=fast.next.next;
slow=slow.next;
}
fast=slow.next;//用fast来指向第二段链表的开头
slow.next=null;//把链表分成两段
ListNode left=sortList(head);
ListNode right=sortList(fast);
ListNode vhead=new ListNode(-1);
ListNode curr=vhead;
while(left!=null&&right!=null){
if(left.val<= right.val){
curr.next=left;
left=left.next;
}else{
curr.next=right;
right=right.next;
}
curr=curr.next;//不要漏掉
}
curr.next=left!=null?left:right;//把剩下的那段直接接上去
return vhead.next;
}
}