LeetCode 725分隔链表Medium
-
题目简述:给定一个头结点为
root
的链表, 编写一个函数以将链表分隔为k
个连续的部分。每部分的长度应该尽可能的相等: 任意两部分的长度差距不能超过 1,也就是说可能有些部分为 null。**这k个部分应该按照在链表中出现的顺序进行输出,并且排在前面的部分的长度应该大于或等于后面的长度。**返回一个符合上述规则的链表的列表。root
的长度范围:[0, 1000]
.- 输入的每个节点的大小范围:
[0, 999]
. k
的取值范围:[1, 50]
.
-
输入:root = [1, 2, 3], k = 5 输出:[[1],[2],[3],[],[]]
输入:root = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], k = 3 输出: [[1, 2, 3, 4], [5, 6, 7], [8, 9, 10]]
-
思路:
- 统计链表总结点个数,根据分隔数
k
计算每个子链表基础节点个数以及需要加1的链表个数 - 开
k
个链表节点类型的数组存每个子链表的节点,将每个子链表的头节点加入数组,然后顺序遍历统计的当前子链表节点个数,然后记录每个子链表尾部节点,将每个子链表的尾节点作为下一个子链表的头节点循环加入数组,直到链表为空。 - 时间复杂度O(N+k)
- 统计链表总结点个数,根据分隔数
/**
* 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 count = 0;
auto cur = root;
while(cur)
{
count++;//统计链表节点个数
cur = cur->next;
}
cur = root;
vector<ListNode*> res(k);
int size = count / k;//每个链表的基础个数
int mod = count % k; //需要加一的链表的个数
for(int i = 0; i < k && cur != nullptr; i++)
{
res[i] = cur;//数组存每个子链表的头节点
int cursize = size + (mod-- > 0 ? 1 : 0);
//一开始已经存入了一个节点,故循环个数少一
for(int j = 0; j < cursize - 1; j++) cur = cur->next;
ListNode *tail = cur->next;
cur->next = nullptr;
cur = tail;//上一个链表的尾节点作为下一链表的头节点
}
return res;
}
};