「携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情」
今天我们来做一下leetcode上面的一道链表题目
题目链接在这里 剑指 Offer II 029. 排序的循环链表
题意
题目给到一个循环的 非递减链表和一个值insertVal,希望我们把值为insertVal的节点插入到链表中,又保持原有的非递减特性。
思路
- 首先,我们需要只对循环链表进行单次遍历,不然就会在遍历过程陷入无限循环。方法当然是,在遍历的过程中遇到了头节点,就可以停止了
- 下一步,我们就需要找到一个节点,在这个节点后面插入新节点之后,保持循环链表的有序性。
- 有一种情况我们很容易会想到,那就是,在遍历的过程中,如果一个节点p的值 小于insertVal而且下个节点的值大于insertVal,即insertVal的值在p和p.next的值之间的话,我们就可以确定p就是待插入的节点了。
- 第二种情况是,如果insertVal不在链表中的两数之间呢? 也就是比链表中的最大值还大,或比最小值还小,这种情况要如何处理呢?
- 我们不假思索的想到,比最大值还打就放到最大值后面呗,比最小值还小放到最小值前面呗
- 但是,如果按照这种处理会比较不好实现,我们可能会转念一想,比最小值还小,也可以放到最大值后面呀,因为最大值后紧跟着就是最小值。
- 然后,问题就变成了,如何找到链表中的最大值的节点了。由于是非降序链表,所以,只有在最大值的位置上,才会有当前节点的值大于下个节点的值。这样,我们就找到了最大值的节点位置,也就完成了这种情况的处理。
代码实现
结束语
这道题我一上来没有做出来,直到看了别人的神级解答之后,才恍然大悟。 两头的边界情况的处理感觉还是有一些技巧在里面的。
如果有更好的分析思路,欢迎大家在评论区发表看法!⛄