class Solution { public: ListNode* slow = nullptr, * fast = nullptr, * head = nullptr, * cur=nullptr; ListNode* sortList(ListNode* head) { if (!head) return nullptr; return MergeSort(head, GetMidNode(head, nullptr), nullptr); } ListNode* GetMidNode(ListNode* begin, ListNode* end) { slow = begin; fast = begin; while (fast!=end && fast->next!=end) { slow = slow->next; fast = fast->next->next; } return slow; } ListNode* MergeSort(ListNode* begin, ListNode* mid, ListNode* end) { if (begin->next == end) { begin->next = nullptr; return begin; } return Merge(MergeSort(begin, GetMidNode(begin, mid), mid), MergeSort(mid, GetMidNode(mid, end), end)); } ListNode* Merge(ListNode* left, ListNode* right) { if (left->val < right->val) { head = left; left = left->next; } else { head = right; right = right->next; } cur = head; while (left && right) { if (left->val < right->val) { cur->next = left; left = left->next; cur = cur->next; } else { cur->next = right; right = right->next; cur = cur->next; } } if (left) { cur->next = left; } if (right) { cur->next = right; } return head; } };