public class Solution {
    private int GetLength(ListNode node) {
        var count = 0;

        for (; node != null; node = node.next) {
            ++count;
        }

        return count;
    }

    public ListNode[] SplitListToParts(ListNode tail, int k) {
        var parts = new ListNode[k];
        Array.Fill(parts, null);

        var listLength = GetLength(tail);
        var (perPart, leftover) = (listLength / k, listLength % k);

        for (var i = 0; i < k && tail != null; ++i) {
            var (node, length) = (tail, perPart);
            parts[i] = node;

            if (leftover > 0) {
                ++length;
                --leftover;
            }

            // Add the regular part
            for (var j = 0; j < length - 1; ++j) {
                node = node.next;
            }

            // Handle the last node in the part as a special case
            (tail, node.next) = (node.next, null);
        }

        return parts;
    }
}