给你一个头结点为 head 的单链表和一个整数 k ,请你设计一个算法将链表分隔为 k 个连续的部分。每部分的长度应该尽可能的相等:任意两部分的长度差距不能超过 1 。这可能会导致有些部分为 null 。这 k 个部分应该按照在链表中出现的顺序排列,并且排在前面的部分的长度应该大于或等于排在后面的长度。返回一个由上述 k 部分组成的数组。
本题关键
$$ countOfList = length / k
$$
$$ remain = length \% k $$
下述代码可以进一步优化,采用链表断开的方式进行处理。
func splitListToParts(head *ListNode, k int) []*ListNode {
var length int
headCopy := head
for headCopy != nil {
length++
headCopy = headCopy.Next
}
var countOfList int
var remain int
countOfList = length / k
remain = length % k
var result []*ListNode
for k != 0 || remain != 0 {
var thisNode *ListNode
thisNode = new(ListNode)
if k != 0 {
for i := 0; i < countOfList; i++ {
insertIn(thisNode,head.Val)
head = head.Next
}
k--
}
if remain != 0{
insertIn(thisNode,head.Val)
head = head.Next
remain--
}
result = append(result, thisNode.Next)
}
return result
}
func insertIn(node *ListNode, val int) {
for node.Next != nil {
node = node.Next
}
node.Next = new(ListNode)
node.Next.Val = val
}