题目描述:具体描述见原题。简单来说就是按照一定规则将链表分割成几个链表
解题思路:首先根据求平均数思想确定长度为l的链表分成n组,每组长度应该为(l/n)。其次数组长度均为整数,所以在(l % n) != 0 的情况下,应该将余数以最小正整数平均化,这样可以保证任意两部分长度均不超过1且每部分长度尽可能相等,按照此种分法,应该有(l%n)组长度为((⌊l/n⌋) + 1),有(n-(l%n))组长度为(⌊l/n⌋)。举个例子,将五颗糖果分给三个小朋友,先求余数为2,那么将有两个幸运小朋友可以获得(⌊5/3⌋ + 1) = 2颗糖果,剩下一个悲伤小朋友将获得1颗糖果。最后注意一些边界情况判定,1.头节点为空,这时候返回n个nil就可以了,2.⌊l/n⌋ == 0得情况,这时候说明糖果大于人数(让人羡慕的买家市场),这时候每个人分一个,剩下全部返回nil即可(nil为go中的空,其余语言对应替换以下就可以了)
具体代码:
func splitListToParts(root *ListNode, k int) []*ListNode {
res := make([]*ListNode, 0)
if root == nil { // 头节点为空情况
for i := 0; i < k; i++ {
res = append(res, nil)
}
return res
}
temp := root
length := 0
for temp != nil {
length++
temp = temp.Next
}
gN := length / k
mN := length % k
cur, head, temp := root, root, root
if gN == 0 { //买家市场情况,我自己瞎起的名字
for i := 0; i < k; i++ {
if cur != nil {
temp = cur.Next
cur.Next = nil
res = append(res, cur)
cur = temp
} else {
res = append(res, nil)
}
}
return res
}
for i := 0; i < mN; i++ {
for j := 0; j < gN; j++ {
cur = cur.Next
}
temp = cur.Next
cur.Next = nil
res = append(res, head)
head = temp
cur = temp
}
for i := 0; i < k - mN; i++ {
for j := 0; j < gN-1; j++ {
cur = cur.Next
}
temp = cur.Next
cur.Next = nil
res = append(res, head)
head = temp
cur = temp
}
return res
}
补充说明:代码有些臃肿,emm,肯定有更好的思路,欢迎留言。