/**
 * 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;
}