给你一个头结点为 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
}