今日题目:排序链表

本文探讨LeetCode中的排序链表问题,介绍了如何利用归并排序的思想解决该问题,详细解析了快慢指针寻找链表中点、非递归分割链表以及合并排序链表的过程。最终提供了一个Java实现的解决方案。
摘要由CSDN通过智能技术生成

    这段时间刷leetcode算法题给我刷的有点崩溃了,随着秋招时间一天一天临近了,然鹅我的算法题刷的依然是一塌糊涂,很多难点的算法题还是不会写,心里也越来越紧张。但还是得刷下去哇。

    刚开始刷的两道链表中判断是否有环感觉还是挺简单的,很快就写出来了,然后刷到了链表的排序这道题,着实不太好懂。但是不好懂也得弄懂,没有办法,只能一步一步来了,下面就开始吧。

题目要求时间空间复杂度分别为O(nlogn)O(nlogn)和O(1)O(1),根据时间复杂度我们自然想到二分法,从而联想到归并排序;

对数组做归并排序的空间复杂度为 O(n)O(n),分别由新开辟数组O(n)O(n)和递归函数调用O(logn)O(logn)组成,而根据链表特性:

数组额外空间:链表可以通过修改引用来更改节点顺序,无需像数组一样开辟额外空间;
递归额外空间:递归调用函数将带来O(logn)O(logn)的空间复杂度,因此若希望达到O(1)O(1)空间复杂度,则不能使用递归。
通过递归实现链表归并排序,有以下两个环节:

分割 cut 环节: 找到当前链表中点,并从中点将链表断开(以便在下次递归 cut 时,链表片段拥有正确边界);
我们使用 fast,slow 快慢双指针法,奇数个节点找到中点,偶数个节点找到中心左边的节点。
找到中点 slow 后,执行 slow.next = None 将链表切断。
递归分割时,输入当前链表左端点 head 和中心节点 slow 的下一个节点 tmp(因为链表是从 slow 切断的)。
cut 递归终止条件:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值