茄子算法每日N題之LeetCode876鏈表的中間結點

LeetCode 876.鏈表的中間結點

你們好,我是靈魂畫師--茄子。技術水平通常,喜歡畫畫。優化

開始今天的正題。指針

給定一個帶有頭結點 head 的非空單鏈表,返回鏈表的中間結點。code

若是有兩個中間結點,則返回第二個中間結點。對象

leetCode876.鏈表的中間結點leetcode

示例 1:get

輸入:[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.io

示例 2:console

輸入:[1,2,3,4,5,6]
輸出:此列表中的結點 4 (序列化形式:[4,5,6])
因爲該列表有兩個中間結點,值分別爲 3 和 4,咱們返回第二個結點。function

1.樸素法(看題解有人這麼叫,我以爲叫循環法或者暴力法更合適一點)

題解:class

  1. 先循環一遍獲取長度。
  2. 取長度的1/2,若是爲偶數則取後一位便可。
let middleNode = function(head) {
    let count = 0;
    let p = head;
    while(p != null){
        count++;
        p = p.next;
    }
    console.log(count)
    count = Math.floor(count/2)
    while(count !== 0){
        console.log(head,count)
        count --;
        head = head.next;
    }
    return head;
};

2.快慢指針

  1. 設置一個快指針,一個慢指針。
  2. 同時指向第一個節點。
  3. 每一次循環,慢指針走一步,快指針走兩步。
  4. 循環完畢,慢指針指向的節點就是咱們須要的節點。
  5. 這裏注意判斷爲奇數的長度,快指針每次走的都是2步,有可能會超出。慢指針也不能再進前進。
// 第一種寫法
let middleNode = function(head) {
    let pre = head;
    let cur = head;
    while(pre != null){
        if(pre.next != null){
            pre = pre.next.next;
            cur = cur.next;
        } else {
            pre = pre.next;
        }
        
    }
    return cur;
};
// 第二種寫法(代碼優化)
let middleNode = function(head) {
    let pre = head;
    let cur = head;
    while(pre != null && pre.next !=null){
        pre = pre.next.next;
        cur = cur.next;
        
    }
    return cur;
};

以上就是個人思路以及解法了,但願你們喜歡我畫的圖解,我會繼續努力的ヾ(◍°∇°◍)ノ゙。(點個贊把我帶走吧~~)

相關文章
相關標籤/搜索