725. 分隔链表

160 阅读1分钟

给你一个头结点为 head 的单链表和一个整数 k ,请你设计一个算法将链表分隔为 k 个连续的部分。

每部分的长度应该尽可能的相等:任意两部分的长度差距不能超过 1 。这可能会导致有些部分为 null 。

这 k 个部分应该按照在链表中出现的顺序排列,并且排在前面的部分的长度应该大于或等于排在后面的长度。

返回一个由上述 k 部分组成的数组。

    const res = new Array(k).fill(null)
  if (head === null) {
      return res
  }
  let count = 0
  let cur = head
  while(cur) {
      count++
      cur = cur.next
  }
  // 可能会分隔不平均,可能存在余量;
  // 比如10个节点,分层3组,name第一组就需要多放一个节点(4,3,3)
  let average = (count / k) | 0
  let j = count % k
  let Len = k
  let pre = (cur = head)
  while (k--) {
    let i
    if (j > 0) {
      // 存在余量,前面的组要多加一个节点
      i = average + 1
      j--
    } else {
      // 不存在余量,或者已被分完
      i = average
    }
    // 头节点cur不变,pre向后移动要分隔的位置
    while (--i > 0 && pre) {
      pre = pre.next
    }
    let next
    if (pre) {
      next = pre.next
      pre.next = null
    }
    res[Len - (k + 1)] = cur
    pre = cur = next
  }
};