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; };
喵喵喵,套路!都是套路!
但愿能帮到有须要的小伙伴。若是以为不错的话,记得『三连』哦。
今天是小猪的生日,因此更加爱大家啦~ 么么哒~