LeetCode725. 分隔链表

这篇文章讲解了如何解决LeetCode题目中将单链表分割成k个相等或接近相等的部分。通过遍历链表获取长度,然后根据长度进行切割,确保每个部分尽可能平均。

LeetCode725. 分隔链表

1. 问题描述

在这里插入图片描述

2. 思路

在这里插入图片描述

3. 代码

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func splitListToParts(head *ListNode, k int) []*ListNode {
    length := 0
    for node := head; node != nil ; node = node.Next {
        length++
    }

    counter, firstCounter := length / k, length % k
    res := make([]*ListNode, k)
    for i, cur := 0, head; i < k && cur != nil ; i++ {
        res[i] = cur
        resSize := counter
        if i < firstCounter {
            resSize++
        }
        for j := 1; j < resSize; j++ {
            cur = cur.Next
        }
        cur, cur.Next = cur.Next, nil
    }
    return res
}

### LeetCode 86 分隔链表 C语言实现 以下是基于题目描述和需求编写的 C 语言解决方案: ```c typedef struct ListNode { int val; struct ListNode* next; } ListNode; struct ListNode* partition(struct ListNode* head, int x) { if (head == NULL || head->next == NULL) return head; // 如果链表为空或者只有一个节点,直接返回原链表 // 创建两个虚拟头结点分别存储小于x的部分和大于等于x的部分 struct ListNode smallDummy = {0}, largeDummy = {0}; struct ListNode *small = &smallDummy, *large = &largeDummy; struct ListNode* current = head; while (current != NULL) { if (current->val < x) { small->next = current; // 将当前节点加入到小于x的部分 small = small->next; } else { large->next = current; // 将当前节点加入到大于等于x的部分 large = large->next; } current = current->next; // 移动到下一个节点 } // 处理边界情况:最后一个节点的next应置为NULL以防成环 large->next = NULL; small->next = largeDummy.next; // 连接两部分链表 return smallDummy.next; // 返回新的头部 } ``` #### 解析 1. **初始化** 使用两个辅助结构体变量 `smallDummy` 和 `largeDummy` 来作为新链表的小于部分和大于等于部分的起始点。这样可以方便地构建两条独立的新链表。 2. **遍历原始链表** 对每一个节点判断其值是否小于给定的目标值 \(x\)。如果是,则将其链接至 `small` 链表;否则链接至 `large` 链表[^1]。 3. **拼接链表** 完成遍历后,将 `large` 的尾部设置为 `NULL`,防止形成循环链表。接着把 `small` 链表的尾部连接到 `large` 链表的头部,从而完成整个链表的重组[^2]。 4. **返回结果** 新链表的头部即为 `smallDummy.next`,因为这是所有小于 \(x\) 节点组成的链表起点[^3]。 --- ### 示例运行 假设输入如下: - 输入链表:\(1 \rightarrow 4 \rightarrow 3 \rightarrow 2 \rightarrow 5 \rightarrow 2\) - 参数 \(x = 3\) 执行上述代码后的输出将是: \[1 \rightarrow 2 \rightarrow 2 \rightarrow 4 \rightarrow 3 \rightarrow 5\] 这表明所有小于 \(x\) 的节点被移动到了前面,而其余节点保持原有顺序[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值