725 分隔链表 :给定一个头结点为 root 的链表, 编写一个函数以将链表分隔为 k 个连续的部分。每部分的长度应该尽可能的相等: 任意两部分的长度差距不能超过 1,也就是说可能有些部分为 null。这 k 个部分应该按照在链表中出现的顺序进行输出,并且排在前面的部分的长度应该大于或等于后面的长度。返回一个由上述 k 部分组成的数组。
1 | 输入:head = [1,2,3], k = 5 |
函数接口:
1 | struct ListNode** splitListToParts(struct ListNode* head, int k, int* returnSize); |
该题就是正常的遍历,然后划分即可。首先,一次遍历计算链表的长度 size;然后,根据链表长度 size 和 k 值,计算划分的链表的长度,前 size % k 段的长度为 size / k + 1,后 size - size % k 段的长度为 size / k。
时间复杂度:O(n),两趟遍历,空间复杂度:O(1),不算输出占用的空间。
1 | struct ListNode** splitListToParts(struct ListNode* head, int k, int* returnSize){ |