/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
#include <queue>

// struct cmp{
//     bool operator ()(ListNode* l1,ListNode* l2)
//     {
//         return l1->val < l2->val;
//     }
// };

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @return ListNode类
     */
    ListNode* sortList(ListNode* head) {
        // write code here
        // 方法一:利用vector + sort排序 + 创建新链表

        // 方法二:利用优先队列priority_queue<>;
        
        // 排序方式,值大的在栈低;
        auto cmp = [](ListNode* l1,ListNode* l2){return l1->val > l2->val;};
        // 定义:priority_queue<Type, Container, Functional>
        // Type 就是数据类型,Container 就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector),Functional 就是比较的方式,当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大顶堆

        // 自定义比较方法可以利用结构体,也可以用匿名函数(lambda表达式)
        priority_queue<ListNode*, vector<ListNode*>, decltype(cmp)> p_q(cmp);
        
        ListNode* t = head;
        while(t)
        {
            ListNode* t_2 = t->next;
            t->next = nullptr;
            
            p_q.push(t);

            t = t_2;
        }

        // 创建链表
        ListNode* ans = new ListNode(-1);
        t = ans;
        int size = p_q.size();

        for(int i=0; i<size; ++i)
        {
            t->next = p_q.top();
            p_q.pop();
            t = t->next;
        }

        return ans->next;
    }   
};