2

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;
};

总结

喵喵喵,套路!都是套路!

希望能帮到有需要的小伙伴。如果觉得不错的话,记得『三连』哦。

今天是小猪的生日,所以更加爱你们啦~ 么么哒~

相关链接

qrcode_green.jpeg


张小猪粉鼻子
2.9k 声望407 粉丝

一只粉色的小猪,喜欢写写代码,看看电影,玩玩游戏社恐,不太会讲话永远跟不上热点