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; };
喵喵喵,套路!都是套路!
但願能幫到有須要的小夥伴。若是以爲不錯的話,記得『三連』哦。
今天是小豬的生日,因此更加愛大家啦~ 麼麼噠~