leetcode 725 分隔链表

147 阅读1分钟

725. 分隔链表

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

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

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

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

思路:

1、分隔链表首先考虑的问题,链表分kparts,每个部分有几个呢

  • 我们将链表拆分之前,需要算一下链表的长度
  • 然后通过Math.floor(len/k)得到了每个部分至少有几个。
  • 这里题目有个要求长度大的排在前面,这里要值得注意的是len / k不一定被整除 所以假如10 被分成了 3 份, 每份最小3

image.png

2、搞定的分组方案,我们就需要按分组放到数组长度为k的数组里 ,然后进行链表分隔 如下图:

GIF 2021-12-7 13-57-04.gif

var splitListToParts = function(head, k) {
    const ans = Array(k).fill(null)
    // len
    let len = 0, cur = head;
    while(cur){
        len++
        cur = cur.next
    }
    let parts = Math.floor(len / k), acounter = len % k
    cur = head
    for(let i = 0; i< k && cur; i++){
        let partSize  = parts + (i < acounter ? 1:0)
        // 添加cur
        ans[i] = cur  
        // 移动到分隔的位置
        for(let j = 1; j < partSize; j++){
            cur= cur.next
        }
     
        let next = cur.next
        cur.next = null  // 进行分隔
        cur = next  // cur指向下一个分隔的起始位置
    }
    return ans
};