在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。
示例 1:
1 | 输入: 4->2->1->3 |
示例 2:
1 | 输入: -1->5->3->4->0 |
问题分析
在八大排序算法中,只有快速排序、堆排序以及归并排序的时间复杂度为O(n log n)。
而在这三种排序算法中,归并排序是最适合用于对链表进行排序的算法。
方法一:递归
通过快慢指针,仅遍历一次链表就可以找到中间位置,将链表一分为二。
然后对得到的两个链表递归执行sortList方法,最后对两个有序链表进行二路归并。
1 | /*public class ListNode { |
复杂度分析:时间复杂度为O(n log n),空间复杂度为O(n)。其中,n为链表的长度。
方法二:迭代
1 | /*public class ListNode { |
复杂度分析:时间复杂度为O(n log n),空间复杂度为O(1)。其中,n为链表的长度。
2020年3月9日,博主在面试支付宝搜索团队时,遇到了这个题目,可惜当时只写出了O(n^2)的解法=_=。