725. 分隔链表
1.题目描述
给定一个头结点为 root 的链表, 编写一个函数以将链表分隔为 k 个连续的部分。
每部分的长度应该尽可能的相等: 任意两部分的长度差距不能超过 1,也就是说可能有些部分为 null。
这k个部分应该按照在链表中出现的顺序进行输出,并且排在前面的部分的长度应该大于或等于后面的长度。
返回一个符合上述规则的链表的列表。
举例: 1->2->3->4, k = 5 // 5 结果 [ [1], [2], [3], [4], null ]
示例 1:
示例 2:
提示:
root 的长度范围: [0, 1000].
输入的每个节点的大小范围:[0, 999].
k 的取值范围: [1, 50].
2.思路
1.求出链表的长度len
2.len/k求出平均每段链表的长度,len%k求出多出平均长度的个数
3.把每段链表的头指针存入结果数组
3.代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
vector<ListNode*> splitListToParts(ListNode* root, int k) {
int len = 0;
ListNode* cur = root;
while(cur != NULL){
cur = cur->next;
len++;
}
int mod = len % k;
int size = len / k;
vector<ListNode*> res(k,NULL);
cur = root;
for(int i = 0;cur != NULL && i < k;++i){
res[i] = cur;
int cur_size = size + (mod-- > 0 ? 1 : 0);
for(int j = 0;j < cur_size - 1;++j){
cur = cur->next;
}
ListNode* next = cur->next;
cur->next = NULL;
cur = next;
}
return res;
}
};
4.复杂度分析
时间复杂度:O(N+k)
空间复杂度:O(k)