力扣-分隔链表

94 阅读2分钟

解题分析

image.png

输入:head = [1,2,3], k = 5
输出:[[1],[2],[3],[],[]]
解释:
第一个元素 output[0] 为 output[0].val = 1 ,output[0].next = null 。
最后一个元素 output[4] 为 null ,但它作为 ListNode 的字符串表示是 [] 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/split-linked-list-in-parts
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

已知我们得到一个链表,想要交它分隔为N份, 情况1:需要被分隔的链表长度比k值小,我们需要进行补全 情况2: 被分隔的链表长度无法被均匀的分配

var splitListToParts = function(head, k) {
    let n = 0;
    let temp = head;
    while (temp != null) {
        n++;
        temp = temp.next;
    }
    let quotient = Math.floor(n / k), remainder = n % k;

    const parts = new Array(k).fill(null);
    let curr = head;
    for (let i = 0; i < k && curr != null; i++) {
        parts[i] = curr;
        let partSize = quotient + (i < remainder ? 1 : 0);
        for (let j = 1; j < partSize; j++) {
            curr = curr.next;
        }
        const next = curr.next;
        curr.next = null;
        curr = next;
    }
    return parts;
};

面试题 02.04. 分割链表

给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。

你不需要 保留 每个分区中各节点的初始相对位置。

 

示例 1:

image.png

输入:head = [1,4,3,2,5,2], x = 3
输出:[1,2,2,4,3,5]

思路

从题面意思看来,就是比大小,创建两个栈空间,一个用来存放大于等于x的节点,一个用来存放小于x的节点, 最后得到两个被分隔好的链表,进行组装链接

 // 链表
function partition(head, x) {
    // 创建大小虚拟头节点
    let big = new ListNode(0)
    let small = new ListNode(0)
    // 复制一份出来遍历
    const smallHead = small
    const bigHead = big
    
    // 进行遍历
    while (head!==null) {
        if (head.val< x) {
            small.next = head
            small = small.next
        }else {
            big.next = head
            big = big.next
        }
        head = head.next
    }
    // 清空
    big.next = null;
    // 进行连接
    small.next = bigHead.next
    return smallHead.next
}
```
```