leetcode-725

145 阅读2分钟

题目描述:具体描述见原题。简单来说就是按照一定规则将链表分割成几个链表

解题思路:首先根据求平均数思想确定长度为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,肯定有更好的思路,欢迎留言。