class Solution { public: // 归并排序的思路,归并排序合并链表,先分后治 ListNode* sortInList(ListNode* head) { if(!head || !head->next) return head; // 将两遍一分为二个,l1 和 l2 ListNode* mid = middle(head); ListNode* l1 = head; ListNode* l2 = mid->next; mid->next = nullptr; // 递归的进行 l1和 l2的拆分。 【分】 ListNode* res1 = sortInList(l1); ListNode* res2 = sortInList(l2); // 最后合并。 【治】 return mergeList(res1, res2); } // 定位到链表的中间节点 ListNode* middle(ListNode* head) { ListNode* fast = head; ListNode* slow = head; while(fast->next && fast->next->next) { fast = fast->next->next; slow = slow->next; } return slow; } // 合并两个有序链表 ListNode* mergeList(ListNode* l1, ListNode* l2) { if(!l1) return l2; if(!l2) return l1; ListNode node(-1); ListNode* cur = &node; while(l1 && l2) { if(l1->val <= l2->val) { cur->next = l1; l1 = l1->next; } else { cur->next = l2; l2 = l2->next; } cur = cur->next; } if(!l1) cur->next = l2; if(!l2) cur->next = l1; return node.next; } };