0147. 对链表进行插入排序
题目地址(147. 对链表进行插入排序)
https://leetcode-cn.com/problems/insertion-sort-list/
题目描述
对链表进行插入排序。

思路
这道题属于链表题目中的修改指针。看过我链表专题的小伙伴应该熟悉我解决这种链表问题的套路了吧?
关于链表的题目,我总结了四个技巧虚拟头, 快慢指针,穿针引线 和 先穿再排后判空,这道题我们使用到了两个,分别是虚拟头和先穿再排后判空。这四个技巧的具体内容可以查看我的《链表专题》。
链表问题首先我们看返回值,如果返回值不是原本链表的头的话,我们可以使用虚拟节点。
此时我们的代码是这样的:
接着,我们理清算法整体框架,把细节留出来。
我们的算法应该有两层循环,外层控制当前需要插入的元素,内层选择插入的位置。
此时我们的代码是这样的:
而选择插入位置的代码也不难,只需要每次都从头出发遍历,找到第一个大于 to_be_insert 的,在其前面插入即可(如果有的话):
而链表插入是一个基本操作,不多解释,直接看代码:
于是完整代码就呼之欲出了:
到这里还没完,继续使用我的第二个技巧先穿再排后判空。由于这道题没有穿,我们直接排序和判空即可。
next 改变的代码一共两行,因此只需要关注这两行代码即可:
inserted 的 next 改变实际上会影响外层,解决方案很简单,留个联系方式就好。这我在上面的文章也反复提到过。
不熟悉这个技巧的看下上面提到的我写的链表文章即可。
如果你上面代码你会了,将 insert 代码整个复制出来就变成大部分人的解法了。不过我还是建议新手按照我的这个模式一步步来,稳扎稳打,不要着急。

代码
代码支持:Python3,Java,JS, CPP
Python Code:
Java Code:
JS Code:
CPP Code:
复杂度分析
时间复杂度:$O(N^2)$,其中 N 为链表长度。
空间复杂度:$O(1)$。
大家对此有何看法,欢迎给我留言,我有时间都会一一查看回答。更多算法套路可以访问我的 LeetCode 题解仓库:https://github.com/azl397985856/leetcode 。 目前已经 38K star 啦。大家也可以关注我的公众号《力扣加加》带你啃下算法这块硬骨头。
最后更新于
这有帮助吗?