/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类 the head node
* @return ListNode类
*/
struct ListNode* sortInList(struct ListNode* head ) {
// write code here
if(head==NULL) return head;
int n,i=0;
struct ListNode *L;
L=head;
printf("%d",head->val);
for(i=1;L!=NULL;i++){ //找节点个数,n-1个
L=L->next;
}
L=head; //L换回头节点,方便下次
n=i;
int *array; //数组存val值
array=NULL;
array=(int *)malloc(sizeof(int)*n);
for(i=1;i<n;i++){ //存入
array[i]=L->val;
L=L->next;
}
int low,high,mid; //nlogn 时间复杂度,用二分法
for(i=2;i<n;i++){
array[0]=array[i];
low=1;
high=i-1;
while(low<=high){
mid=(low+high)/2;
if(array[mid]>=array[0]){
high=mid-1;
}
else{
low=mid+1;
}
} //跳出的时候,array[i]=array[0]放在high+1位置
int j=0;
for(j=i-1;j>high;j--){ //把high+1至i-1后移一位,,high+1也要移动
array[j+1]=array[j];
}
array[high+1]=array[0];
}
L=head; //L换回头节点,next和数组下标i,结合数据放进原链表。不用申请新的链表
for(i=1;i<n&&L!=NULL;i++){
L->val=array[i];
L=L->next;
}
return head;
}