题解 | #单链表的排序#
单链表的排序
https://www.nowcoder.com/practice/f23604257af94d939848729b1a5cda08
/** * struct ListNode { * int val; * struct ListNode *next; * ListNode(int x) : val(x), next(nullptr) {} * }; */ /* 思路:将链表复制到数组中,根据复杂度要求,对数组使用归并排序 */ #include <array> #include <iostream> class Solution { public: void Merge(std::array<int, 100000>& inArr, std::array<int, 100000>& outArr, int start, int mid, int end) { int i = start; int j = mid + 1; int k = start; while (i <= mid || j <= end) { if (i > mid) { outArr[k++] = inArr[j++]; } else if (j > end) { outArr[k++] = inArr[i++]; } else if (inArr[i] <= inArr[j]) { outArr[k++] = inArr[i++]; } else { outArr[k++] = inArr[j++]; } } // important for (int s = start; s <= end; s++) { inArr[s] = outArr[s]; } } void MergeSort(std::array<int, 100000>& inArr, std::array<int, 100000>& outArr, int start, int end) { if (start < end) { auto mid = (start + end) / 2; MergeSort(inArr, outArr, start, mid); MergeSort(inArr, outArr, mid + 1, end); Merge(inArr, outArr, start, mid, end); } } /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param head ListNode类 the head node * @return ListNode类 */ ListNode* sortInList(ListNode* head) { // write code here auto tmpNode = head; std::array<int, 100000> inArr; std::array<int, 100000> outArr; int i = 0; while (tmpNode != nullptr) { inArr[i++] = tmpNode->val; tmpNode = tmpNode->next; } MergeSort(inArr, outArr, 0, i - 1); for (int s = 0; s < i; s++) { std::cout << inArr[s]; } tmpNode = head; i = 0; while (tmpNode != nullptr) { tmpNode->val = outArr[i++]; tmpNode = tmpNode->next; } return head; } };
在线编程练习 文章被收录于专栏
C++在线编程练习题解