Sort a linked list in O(n log n) time using constant space complexity.
Example 1:
Input: 4->2->1->3
Output: 1->2->3->4
Example 2:
Input: -1->5->3->4->0
Output: -1->0->3->4->5
/**
* 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) {
List<Integer> list=new ArrayList<>();
while(head!=null) {
list.add(head.val);
head=head.next;
}
switch(list.size()){
case 0:return null;
case 1:return new ListNode(list.get(0));
default:{
quickSort(0, list.size()-1, list);
ListNode listNode=new ListNode(0);
ListNode cur=listNode;
for(int i=0;i<list.size();i++) {
ListNode list1=new ListNode(list.get(i));
cur.next=list1;
cur=list1;
}
return listNode.next;
}
}
}
void quickSort(int sta,int end,List<Integer> list) {
if(sta>end)return ;
int i=sta,j=end,base=list.get(sta);
while(i<j) {
while(j>i&&list.get(j)>=base)j--;
while(i<j&&list.get(i)<=base)i++;
if(i<j) {
int temp=0;
temp=list.get(i);
list.set(i, list.get(j));
list.set(j, temp);
}
}
list.set(sta, list.get(i));
list.set(i,base);
quickSort(sta, i-1, list);
quickSort(i+1, end, list);
}
}
自己手写快速排序,算是个不错的练习吧,虽然效率不高。。hhh