Sort List Leetcode #148 题解[C++]
程序员文章站
2022-06-03 10:36:33
...
题目来源
https://leetcode.com/problems/sort-list/description/
题目描述
Sort a linked list in O(n log n) time using constant space complexity.
Example 1:
Input: 4->2->1->3
Output: 1->2->3->4
Example 2:
Input: -1->5->3->4->0
Output: -1->0->3->4->5
给出一个链表. 要求在O(1)的空间复杂度和O(n Logn)的时间复杂度要求下完成排序.
解题思路
这是数据结构与算法中很经典, 也相当基础的一道题.
O(n log n)时间复杂度和O(1)空间复杂度让我们很容易就想到了分治法排序这一经典套路. 在本题中笔者使用了归并排序.
代码的大概思路如下:
- 递归的调用排序函数排序链表
- 将链表平均的分成两半—通过每次迭代让尾指针走两步, 中点指针走一步, 待到尾指针指向末尾时就得到了链表的重点指针; 若链表不能再分时, 直接返回;
- 对于前半部分和后半部分, 分别回到步骤 1;
- 合并排序好的前后两部分, 返回最终的指针;
代码实现
以下的代码部分参考了之前的数据结构课所用教材: Data Structure and Program Design in C++, [Robert L. Kruse, 2003]
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
ListNode* sortList(ListNode* head) {
recursive_merge_sort(head);
return head;
}
void recursive_merge_sort(ListNode* &head) {
if (head != nullptr&&head->next != nullptr) {
ListNode* second_half = divide_from(head);
recursive_merge_sort(head);
recursive_merge_sort(second_half);
head = merge(head, second_half);
}
}
ListNode* merge(ListNode* head, ListNode* second_half) {
ListNode combined=ListNode(0);
ListNode* last_sorted = &combined;
while (head != nullptr&&second_half != nullptr) {
if (head->val < second_half->val) {
last_sorted->next = head;
head = head->next;
}
else {
last_sorted->next = second_half;
second_half = second_half->next;
}
last_sorted = last_sorted->next;
}
if (head == nullptr) last_sorted->next = second_half;
else last_sorted->next = head;
return combined.next;
}
ListNode* divide_from(ListNode* head) {
ListNode* second_half, *position, *midpoint;
if ((midpoint = head) == nullptr) return nullptr;
position = midpoint->next;
while (position != nullptr) {
position = position->next;
if (position != nullptr) {
position = position->next;
midpoint = midpoint->next;
}
}
second_half = midpoint->next;
midpoint->next = nullptr;
return second_half;
}
};
推荐阅读
-
LeetCode 热题 HOT 100 Java题解——148. 排序链表
-
C++实现LeetCode(148.链表排序)
-
LeetCode C++ 454. 4Sum II【Hash Table/Sort/Two Pointers/Binary Search】
-
LeetCode 题解 | LCP 12. 小张刷题计划(最大值最小化 二分答案 C++)
-
Merge K Sorted List Leetcode #23 题解[C++]
-
Triangle Leetcode #120 题解[C++]
-
Median of Two Sorted Arrays Leetcode #4 题解[C++]
-
Sort List Leetcode #148 题解[C++]
-
Leetcode题解系列——Max Area of Island(c++版)
-
LeetCode 热题 HOT 100 Java题解——148. 排序链表