[路飞]_leetcode_725.分隔链表

94 阅读1分钟

思考

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

首先链表 要分 k 个部分,

  1. 其中有可能链表的长度可能小于 k ,少的部分需要用 null 填。
  2. 如果链表长度大于 k 那么就开始对链表分块,且每块的长度差距不超过1,排在前面的长度需要大于后面的长度。

解题思路

  1. 获取链表长度。
  2. 获取每个分隔链表的长度,和剩余的节点个数。
  3. 计算每个分隔链表,每分配一个分隔链表,查看是否还有剩余的节点个数,如果有取出一个放到分隔链表中。

代码

var splitListToParts = function(head, k) {
    let len = 0, pre = head, result = []; 
    // 计算链表长度
    while(pre) {
        pre = pre.next;
        len++
    }
    // 计算每个分隔链表长度
    let itemLen = Math.floor(len / k);
    // 计算剩余未分配的节点个数
    let carry = len % k;
    // 设置虚拟头节点,因为要操作头节点
    let hair = new ListNode(-1, head);
    for (let i = 0; i < k; i++) {
        let pre = hair, num = itemLen;
        while(num--) {
            pre = pre.next;
        }
        if (carry-- > 0 && pre) pre = pre.next;
        result.push(hair.next || null);
        let next = pre.next || null;
        pre.next = null;
        hair.next = next;
    }
    return result;
};