Skip to content

Latest commit

 

History

History
60 lines (48 loc) · 1.47 KB

876-链表的中间节点.md

File metadata and controls

60 lines (48 loc) · 1.47 KB

876-链表的中间节点

原题

这个方案真是太牛逼了,叫快慢指针,开始我还不知道快慢指针是啥意思 现在觉得能想出来这种方法的人,脑子真的是很聪明

// 通过建立两个指针,slow指针每次只往下走一位,fast每次都往下走两位,
// 这样在 fast 到达终点的时候,slow 就刚好走到一半了,这样的复杂度就只是 O(n)
// 太牛逼了,而且只需要遍历一次就可以
const middleNode = function (head) {
  slow = fast = head;
  while (fast && fast.next) {
    slow = slow.next;
    fast = fast.next.next;
  }
  return slow;
};

最基础的方法,就是遍历一次,然后把所有的数据添加到数组中,然后取数组的中间值

const middleNode = function (head) {
  let arr = [head];
  while (arr[arr.length - 1].next !== null) {
    arr.push(arr[arr.length - 1].next);
  }

  return arr[Math.trunc(arr.length / 2)];
};

使用单指针的方式,就必须要循环两次了

const middleNode = function (head) {
  let n = 0;
  let cur = head;
  while (cur.next) {
    n++;
    cur = cur.next;
  }

  let k = 0;
  cur = head;
  while (k < Math.trunc(n / 2)) {
    k++;
    cur = cur.next;
  }
  return cur;
};

复杂度分析

时间复杂度:O(N),其中 N 是给定链表的结点数目。

空间复杂度:O(1),只需要常数空间存放变量和指针。