#include<iostream>
using namespace std;//Sort a linked list in O(n log n) time using constant space complexity.//Definition for singly-linked list.
//归并排序
#if 0
struct ListNode {int val;ListNode *next;ListNode(int x) : val(x), next(NULL) {}};
struct LinkList {int size;ListNode head;
};
class Solution {
public:ListNode *sortList(ListNode *head) {}LinkList *PushElement(LinkList* linklist, int val) {if (linklist->size == 0) {return NULL;}ListNode* listnode = (ListNode*)malloc(sizeof(ListNode));listnode = linklist->head.next;listnode->val = val;listnode->next = NULL;linklist->size++;return linklist;}int getTopElement(LinkList* linklist) {if (linklist->size == 0) {return 0;}ListNode* listnode = (ListNode*)malloc(sizeof(ListNode));for (int i = 0; i < linklist->size; i++){listnode = linklist->head.next;}return listnode->val;}
};
#endif
#if 1//Definition for singly-linked list.
struct ListNode {int val;ListNode *next;ListNode(int x) : val(x), next(NULL) {}
};class Solution {
public:ListNode *sortList(ListNode *head) {if (head == NULL || head->next == NULL)return head;ListNode* slow = head;ListNode* fast = head->next;while (fast != NULL && fast->next != NULL && slow != NULL){fast = fast->next->next;slow = slow->next;}ListNode* left = sortList(slow->next);slow->next = NULL;ListNode* right = sortList(head);return mergeTwoList(left, right);}ListNode *mergeTwoList(ListNode* left, ListNode *right){ListNode* dummy = new ListNode(0);ListNode* p = dummy;while (left && right){if (left->val > right->val){p->next = right;right = right->next;}else{p->next = left;left = left->next;}p = p->next;}if (left == NULL)p->next = right;if (right == NULL)p->next = left;return dummy->next;}
};#endif