目录

0725:分隔链表(★)

力扣第 725 题

题目

给你一个头结点为 head 的单链表和一个整数 k ,请你设计一个算法将链表分隔为 k 个连续的部分。

每部分的长度应该尽可能的相等:任意两部分的长度差距不能超过 1 。这可能会导致有些部分为 null 。

k 个部分应该按照在链表中出现的顺序排列,并且排在前面的部分的长度应该大于或等于排在后面的长度。

返回一个由上述 k 部分组成的数组。

示例 1:

输入:head = [1,2,3], k = 5
输出:[[1],[2],[3],[],[]]
解释:
第一个元素 output[0] 为 output[0].val = 1 ,output[0].next = null 。
最后一个元素 output[4] 为 null ,但它作为 ListNode 的字符串表示是 [] 。

示例 2:

输入:head = [1,2,3,4,5,6,7,8,9,10], k = 3
输出:[[1,2,3,4],[5,6,7],[8,9,10]]
解释:
输入被分成了几个连续的部分,并且每部分的长度相差不超过 1 。前面部分的长度大于等于后面部分的长度。

提示:

  • 链表中节点的数目在范围 [0, 1000]
  • 0 <= Node.val <= 1000
  • 1 <= k <= 50

分析

先得到链表长度 n,应该平均分为 n // k 长度,但可能有余数 extra。根据题目要求,应该将前 extra 个链表的长度再分别加 1。

注意可能分为空链表,所以每轮从哑结点开始,防止越界。

解答

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
def splitListToParts(self, root: ListNode, k: int) -> List[ListNode]:
	n, p = 0, root
	while p:
		n += 1
		p = p.next
	avg, extra = divmod(n, k)
	res, p = [root], ListNode(next=root)
	for i in range(k-1):
		for _ in range(avg+(i<extra)):
			p = p.next
		res.append(p.next)
		p.next = None
		p = ListNode(next=res[-1])
	return res

44 ms