leetcode 725 分割链表
leetcode 725 分割链表
解题思路
1、计算链表长度:
首先遍历整个链表,得到总长度length,这是分割的基础
2、确定各部分长度:
计算基础长度base_len = length / k,这是每个部分至少包含的节点数
计算多余节点数extra = length % k,前extra个部分会各多 1 个节点
3、执行分割:
创建一个大小为 k 的结果数组,初始值都为 nullptr
遍历 k 次,每次处理一个部分:
记录当前部分的头节点
根据是否是前extra个部分,确定当前部分的实际长度
移动指针到当前部分的末尾
断开与后续节点的连接,完成当前部分的分割
这种方法确保了:
前extra个部分比其他部分多 1 个节点
各部分长度差不超过 1
前面的部分长度大于或等于后面的部分
当链表长度小于 k 时,后面的部分会为 null
时间复杂度为 O (n + k),其中 n 是链表长度;空间复杂度为 O (k) 用于存储结果。
vector<ListNode*> splitListToParts(ListNode* head, int k) {// 1. 计算链表总长度int length = 0;ListNode* current = head;while (current) {length++;current = current->next;}// 2. 计算每个部分的基础长度和多余的节点数int base_len = length / k; // 每个部分至少有的节点数int extra = length % k; // 前extra个部分会多1个节点// 3. 分割链表vector<ListNode*> result(k, nullptr);current = head;for (int i = 0; i < k; i++) {result[i] = current; // 记录当前部分的头节点// 计算当前部分的长度int current_len = base_len + (i < extra ? 1 : 0);// 移动到当前部分的末尾(如果有节点的话)for (int j = 1; j < current_len && current; j++) {current = current->next;}// 断开链表连接if (current) {ListNode* next = current->next;current->next = nullptr;current = next;}}return result;}