题解
关键点在于k<size的时候怎么按照题目正确划分每个part的数量
size=10,k=3的时候,得到4,3,3的组合
size=14,k=3的时候,得到4,4,3,3的组合
容易得到规律,basic=size//k
是每个划分区域的基础大小,然后初始化我们让每个part
大小为basic
,然后我们把size%k
的数量,依次给前面的每个part加1,这样刚好是正确的数量
然后我们需要实现一个摘下链表前n个结点的代码
# 取得一段链表的前n个结点,并且返回截取后的新链表
def getPart(self,head,n):
if not head:
return head,head
t = head
# 尝试取出n个结点,有足够的结点可以取
while n-1 and head.next:
n -= 1
head = head.next
nh = head.next
head.next = None
# 取出的链表部分和新的首结点
return t,nh
然后我们就可以得到代码
class Solution:
# 取得一段链表的前n个结点,并且返回截取后的新链表
def getPart(self,head,n):
if not head:
return head,head
t = head
# 尝试取出n个结点
while n-1 and head.next:
n -= 1
head = head.next
nh = head.next
head.next = None
# 取出的链表部分和新的首结点
return t,nh
def splitListToParts(self, head: ListNode, k: int) -> List[ListNode]:
# 统计size
size = 0
p = head
while p:
p = p.next
size += 1
ans = []
# 得到每个part的大小
basic = size//k
ret = size%k
num = [basic]*k
ind = 0
while ret:
num[ind]+=1
ind += 1
ret -= 1
# 开始遍历取链表
ind = 0
while head:
t,head = self.getPart(head,num[ind])
ind += 1
ans.append(t)
# 链表已经取完了,剩下全部填充None
while ind<len(num):
ans.append(None)
ind+=1
return ans
进一步的,可以简化取part部分的代码
class Solution:
# 取得一段链表的前n个结点,并且返回截取后的新链表
def getPart(self,head,n):
if not head:
return head,head
t = head
# 尝试取出n个结点
while n-1 and head.next:
n -= 1
head = head.next
nh = head.next
head.next = None
# 取出的链表部分和新的首结点
return t,nh
def splitListToParts(self, head: ListNode, k: int) -> List[ListNode]:
# 统计size
size = 0
p = head
while p:
p = p.next
size += 1
ans = []
# 得到每个part的大小
basic = size//k
ret = size%k
num = [basic]*k
for i in range(ret):
num[i] += 1
# 开始遍历取链表
ind = 0
while head:
t,head = self.getPart(head,num[ind])
ind += 1
ans.append(t)
# 链表已经取完了,剩下全部填充None
while ind<len(num):
ans.append(None)
ind+=1
return ans