/**
 * struct ListNode {
 *    int val;
 *    struct ListNode *next;
 * };
 */

class Solution {
public:
    /**
     * 
     * @param head ListNode类 the head node
     * @return ListNode类
     */
    ListNode* sortInList(ListNode* head) {
        // write code here
        //首先这题给了空间复杂度为O(n),时间复杂度为O(nlogn),那我肯定就意识到要用排序时间
        //时间复杂度为ologn的排序算法排一下就行了,因为归并排序不是很熟悉所以这里用一下堆排
        //这么说来还得练下归并排序啊。。。。好心累,为什么只有我是菜狗
       //哎,写了一大堆堆排没过,是你逼我无脑快排的。。
        int len=lenth(head);
        int array[len];
        int heapSize=len;//确定堆的范围
        int ans=0;//专门给array数组用的
        while(head)
        {
            array[ans++]=head->val;
            head=head->next;
        }
        //循环结束后array数组就变成了一个小根堆
        sort(array,&array[len]);
        ListNode* Head=new ListNode(0);
        ListNode* res=new ListNode(0);
        Head=res;
        for(int i=0;i<len;i++)
        {
            cout<<array[i]<<endl;
            ListNode* s=new ListNode(0);
            s->next=NULL;
            s->val=array[i];
            res->next=s;
            res=s;
        }
        return Head->next;
    }
    int lenth(ListNode* head)
    {
        int count=0;
        while(head)
        {
            count++;
            head=head->next;
        }
        return count;
    }
};