Hi 大家好,我是张小猪。欢迎来到『宝宝也能看懂』系列特别篇 - 30-Day LeetCoding Challenge。这是一个 leetcode 官方的小活动。可以在官网看到,从 4 月 1 号开始,每天官方会选出一道题,在 24 小时内完成即可获得一点小奖励。
这里是 4 月 8 号的题,也是题目列表中的第 876 题 -- 『链表的中间结点』
题目描述
给定一个带有头结点 head
的非空单链表,返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
示例 1:
输入:[1,2,3,4,5]
输出:此列表中的结点 3 (序列化形式:[3,4,5])
返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。
注意,我们返回了一个 ListNode 类型的对象 ans,这样:
ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = NULL.
示例 2:
输入:[1,2,3,4,5,6]
输出:此列表中的结点 4 (序列化形式:[4,5,6])
由于该列表有两个中间结点,值分别为 3 和 4,我们返回第二个结点。
提示:
- 给定链表的结点数介于
1
和100
之间。
官方难度
EASY
解决思路
这是一个比较典型的问题,并且我们在之前30天挑战第二天的题解的方案 2 中就提到过一种思路 -- 快慢指针。所以小猪这里就不做过多的分析了,直接给方案啦。
直接方案
通过两个指针来标识位置,其中快指针每次移动两步,而慢指针每次移动一步。这样当快指针到达链表末端的时候,慢指针正好移动到一半。
这里需要注意的点是,题目要求如果是偶数个节点,返回中间靠后的那一个。针对这一点,我们可以通过让快指针能够跳出末端成为 null
,来确保对于总共是偶数个节点的最后那一次慢指针移动。
具体代码如下:
const middleNode = (head) => {
let slow = fast = head;
while (fast !== null && fast.next !== null) {
fast = fast.next.next;
slow = slow.next;
}
return slow;
};
总结
喵喵喵,套路!都是套路!
希望能帮到有需要的小伙伴。如果觉得不错的话,记得『三连』哦。
今天是小猪的生日,所以更加爱你们啦~ 么么哒~
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。