[宝宝也能看懂的活动篇][30-Day LeetCoding Challenge] 第八天

Hi 你们好,我是张小猪。欢迎来到『宝宝也能看懂』系列特别篇 - 30-Day LeetCoding Challenge。这是一个 leetcode 官方的小活动。能够在官网看到,从 4 月 1 号开始,天天官方会选出一道题,在 24 小时内完成便可得到一点小奖励。git

这里是 4 月 8 号的题,也是题目列表中的第 876 题 -- 『链表的中间结点』github

题目描述

给定一个带有头结点 head 的非空单链表,返回链表的中间结点。shell

若是有两个中间结点,则返回第二个中间结点。segmentfault

示例 1:spa

输入:[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,咱们返回第二个结点。

提示:code

  • 给定链表的结点数介于 1 和 100 之间。

官方难度

EASY对象

解决思路

这是一个比较典型的问题,而且咱们在以前30天挑战次日的题解的方案 2 中就提到过一种思路 -- 快慢指针。因此小猪这里就不作过多的分析了,直接给方案啦。blog

直接方案

经过两个指针来标识位置,其中快指针每次移动两步,而慢指针每次移动一步。这样当快指针到达链表末端的时候,慢指针正好移动到一半。leetcode

这里须要注意的点是,题目要求若是是偶数个节点,返回中间靠后的那一个。针对这一点,咱们能够经过让快指针可以跳出末端成为 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

相关文章
相关标签/搜索