题解 | #单链表的排序#
单链表的排序
https://www.nowcoder.com/practice/f23604257af94d939848729b1a5cda08
/** * struct ListNode { * int val; * struct ListNode *next; * ListNode(int x) : val(x), next(nullptr) {} * }; */ #include <cerrno> #include <fstream> class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param head ListNode类 the head node * @return ListNode类 */ ListNode* sortInList(ListNode* head) { /* 使用二路归并排序(递归) */ // 0个或1个节点 if (head == nullptr || head->next == nullptr) { return head; } // 使用快慢指针找链表中点,最终slow指向中点前一个节点,fast指向倒数第一或第二个节点 ListNode* fast = head->next; ListNode* slow = head; while (fast->next != nullptr && fast->next->next != nullptr) { slow = slow->next; fast = fast->next->next; } // 切割左右链表 ListNode* head2 = slow->next; slow->next = nullptr; // 递归左链表排序 ListNode* left = sortInList(head); // 递归右链表排序 ListNode* right = sortInList(head2); // 排序 ListNode* tmp = new ListNode(0); ListNode* res = tmp; while (left != nullptr && right != nullptr) { if (left->val <= right->val) { tmp->next = left; left = left->next; } else { tmp->next = right; right = right->next; } tmp = tmp->next; tmp->next = nullptr; } // 剩余直接连接 tmp->next = (left != nullptr) ? left : right; return res->next; } };