题目描述(中等难度)

    要求时间复杂度为 ,最常用的就是归并排序了。

    解法一

    归并排序需要一个辅助方法,也就是对两个有序链表进行合并,在 已经讨论过。

    至于归并排序的思想,这里就不多讲了,本科的时候用 Scratch 做过一个演示视频,感兴趣的可以参考 这里,哈哈。

    那就直接放代码了。因为归并排序是一半一半的进行,所以需要找到中点。最常用的方法就是快慢指针去找中点了。

    如果 和 fast 都从 head 开始走,那么当 fast 结束的时候, 就会走到后边一半节点的开头了。

    当然除了上边的方法,在 看到,还可以加一个 pre 指针,让它一直指向 slow 的前一个即可。

    他们的目的都是一样的,就是为了方便的把两个链表平均分开。

    当然严格的说,上边的解法空间复杂度并不是 O(1),因为递归过程中压栈是需要消耗空间的,每次取一半,所以空间复杂度是 。

    147 题 一样,主要还是考察对链表的理解和排序算法的实现。

    添加好友一起进步~

    如果觉得有帮助的话,可以点击 给一个 star 哦 ^^