解题思路:
这道题是要我们用O(n log n) 的时间复杂度来对一个链表进行排序
O(n log n) 复杂度的排序算法就是归并排序了
这里对链表的排序用到了归并排序的思想
提交代码:
class Solution {
public ListNode sortList(ListNode head) {
if(head==null||head.next==null) return head;
// divide the list into 2
ListNode pre=null,slow=head,fast=head;
while(fast!=null&&fast.next!=null) {
pre=slow;
slow=slow.next;
fast=fast.next.next;
}
pre.next=null;
head=sortList(head);
slow=sortList(slow);
return mergeSort(head,slow);
}
public ListNode mergeSort(ListNode head1,ListNode head2) {
ListNode dummy=new ListNode(-1);
ListNode p=dummy,p1=head1,p2=head2;
while(p1!=null&&p2!=null) {
if(p1.val<p2.val) {
p.next=p1;
p1=p1.next;
}else {
p.next=p2;
p2=p2.next;
}p=p.next;
}
while(p1!=null) {
p.next=p1;
p1=p1.next;
p=p.next;
}
while(p2!=null) {
p.next=p2;
p2=p2.next;
p=p.next;
}
return dummy.next;
}
}
运行结果: