给定一个头结点为 root 的链表, 编写一个函数以将链表分隔为 k 个连续的部分。
每部分的长度应该尽可能的相等: 任意两部分的长度差距不能超过 1,也就是说可能有些部分为 null。
这k个部分应该按照在链表中出现的顺序进行输出,并且排在前面的部分的长度应该大于或等于后面的长度。
返回一个符合上述规则的链表的列表。
举例: 1->2->3->4, k = 5, 结果 [ [1], [2], [3], [4], null ]
示例 1:
1 | 输入: |
示例 2:
1 | 输入: |
提示:
root
的长度范围:[0, 1000]
.- 输入的每个节点的大小范围:
[0, 999]
. k
的取值范围:[1, 50]
.
方法
步骤:
1.统计原链表的长度n;
2.计算分隔后每个部分的长度$\mathrm{length_i}(0 \le i < k)$,令$r = n\ \%\ k$
$$
\mathrm{length_i =
\begin{cases}
\frac{n}{k} + 1, & 0 \le i < r \\
\frac{n}{k}, & r \le i < k
\end{cases}
}
$$
3.分隔链表。
分隔链表可以采用以下两种方式:
- 遍历链表,将链表分隔为k个部分。如果k>n,则在返回的列表末尾补k-n个空链表;
1 | # Definition for singly-linked list. |
- 循环K次,每次分隔出一部分。
1 | # Definition for singly-linked list. |
时间复杂度:O(n + k)
空间复杂度:O(k)