leetcode-725-分隔链表

114 阅读1分钟

image.png leetcode原题

解题思路

  • 先经过一轮遍历,统计出链表的长度count;

  • 新建一个长度为k的数组result = new Array(k),记录我们要返回的结果;

  • 对数组进行填充,每个数组的链表长度最少为Math.floor(count / k),然后前面count % k个元素,每个长度加一。主要意思是,如果有8个元素,要分成3份,那么每个元素一开始初始长度都是2,这时候还残留2个待分配的节点,就在数组的前两位各加一;

  • 通过map方法把数字改成链表的节点即可。

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} k
 * @return {ListNode[]}
 */
var splitListToParts = function(head, k) {
    // 一轮遍历计算出长度
    let count = 0, cur = head;
    while (cur) {
        cur = cur.next;
        count++;
    }

    // 结果中每个节点的长度
    let result = new Array(k).fill(Math.floor(count / k));

    // 平均分配完,有多的加到前面的节点
    let over = count % k;
    while (over > 0) {
        result[over - 1]++;
        over--;
    }

    // 根据各段的长度切割链表
    return result.map(item => {
        let newItem = head;
        let cur = newItem;

        // 一开始进来就是第一个节点了
        while (item > 1) {
            cur = cur && cur.next;
            item--;
        }

        if (cur) {
            const next = cur.next;
            cur.next = null;
            head = next;
        } 

        return newItem;
    });
};