Leetcode-editorials
Contribute
  • Leetcode question of the day
  • 08-August
    • 26. Maximum Length of Pair Chain
    • 28. Implement stack using queues
    • 29. Minimum Penalty for a Shop
    • 30. Minimum Replacements to Sort the Array
    • 31. Minimum Number of Taps to Open to Water a Garden
  • 09-September
    • 01. Counting Bits
    • 02. Extra Characters in a String
    • 03. Unique Paths
    • 04. Linked List Cycle
    • 05. Copy List with Random Pointer
    • 06. Split Linked List in Parts
    • 07. Reverse Linked List II
    • 08. Pascal's Triangle
    • 09. Combination Sum IV
    • 10. Count All Valid Pickup and Delivery Options
    • 11. Group the People Given the Group Size They Belong To
    • 12. Minimum Deletions to Make Character Frequencies Unique
    • 13. Candy
    • 14. Reconstruct Itinerary
    • 15. Min Cost to Connect All Points
    • 16. Path With Minimum Effort
    • 17. Shortest Path Visiting All Nodes
    • 18. The K Weakest Rows in a Matrix
    • 19. Find the Duplicate Number
    • 20. Minimum Operations to Reduce X to Zero
    • 21-Median of Two Sorted Arrays
    • 22- Is Subsequence
    • 23- Longest String Chain
    • 24- Champagne Tower
    • 25- Find the Difference
    • 26- Remove Duplicate Letters
    • 27- Decoded String at Index
    • 28- Sort Array By Parity
    • 29- Monotonic Array
    • 30- 132 Pattern
  • 10-October
    • 01. Reverse Words in a String III
    • 02. Remove Colored Pieces if Both Neighbors are the Same Color
    • 03. Number of Good Pairs
    • 04. Design HashMap
    • 05. Majority Element II
    • 06. Integer Break
    • 07. Build Array Where You Can Find The Maximum Exactly K Comparisons
  • 11-November
    • 01. Find Mode in Binary Search Tree
    • 02. Count Nodes Equal to Average of Subtree
    • 03. Build an Array With Stack Operations
    • 04. Last Moment Before All Ants Fall Out of a Plank
    • 07. Eliminate Maximum Number of Monsters
  • Leetcode Contests
    • Weekly Contest
      • Weekly-Contest-360
Powered by GitBook
On this page
  • My Approach
  • Time and Auxiliary Space Complexity
  • Code (C++)
  • Contribution and Support

Was this helpful?

Edit on GitHub
  1. 09-September

06. Split Linked List in Parts

Previous05. Copy List with Random PointerNext07. Reverse Linked List II

Last updated 1 year ago

Was this helpful?

The problem can be found at the following link:

My Approach

The key insight here is that we can efficiently split the linked list into equal-sized parts by calculating the minimum guaranteed size of each part (n) and distributing any extra nodes (r) as evenly as possible among the first r parts. This approach ensures that we meet both conditions specified in the problem statement.

By maintaining two pointers (node and prev) and updating them as we traverse the linked list, we can keep track of the current part and efficiently split the list into k parts.

  1. Create a vector of ListNode pointers called "parts" with k elements, all initialized to nullptr. This vector will store the head nodes of the k sublists.

  2. Initialize a variable "len" to 0. This variable will be used to calculate the total number of nodes in the linked list.

  3. Loop through the linked list using a pointer "node" starting from the "root" node.

    • For each node in the list, increment the "len" variable by 1, counting the total number of nodes.

  4. Calculate two values, "n" and "r":

    • "n" represents the approximate number of nodes in each of the k sublists, which is obtained by dividing "len" by "k."

    • "r" represents the remainder of the division "len % k," which accounts for the number of sublists that need to have an extra node to balance them.

  5. Initialize two pointers, "node" (pointing to the head of the original list) and "prev" (initialized to nullptr).

  6. Loop through the process of splitting the linked list into k parts:

    • Iterate from 0 to k-1 in a loop (i.e., for each of the k sublists).

    • Assign the current "node" to the "i"-th element of the "parts" vector. This marks the beginning of the sublist.

    • Loop "j" from 0 to "n + (r > 0)" times. This inner loop traverses through the sublist, where "n" is the average number of nodes per sublist, and "r > 0" indicates that some sublists need an extra node.

    • Inside the inner loop, update the "prev" pointer to point to the current "node," and move the "node" pointer to the next node in the original list.

    • Set the "next" pointer of "prev" to nullptr. This effectively cuts off the current sublist from the original list.

  7. After the loop completes, the "parts" vector contains the k sublists, and each sublist is separated from the original list.

  8. Return the "parts" vector, which now holds the head nodes of the k sublists.

Time and Auxiliary Space Complexity

  • Time Complexity: O(n)

  • Auxiliary Space Complexity: O(1)

Code (C++)


class Solution {
public:
    vector<ListNode*> splitListToParts(ListNode* root, int k) {
        vector<ListNode*> parts(k, nullptr);

        int len = 0;
        for (ListNode* node = root; node; node = node->next){
            len++;
        }

        int n = len / k, r = len % k;
        ListNode* node = root, *prev = nullptr;

        for (int i = 0; node && i < k; i++, r--) {
            
            parts[i] = node;
            for (int j = 0; j < n + (r > 0); j++) {
                prev = node;
                node = node->next;
            }
            
            prev->next = nullptr;
        }
        return parts;
    }
};

Contribution and Support

For discussions, questions, or doubts related to this solution, please visit our . We welcome your input and aim to foster a collaborative learning environment.

If you find this solution helpful, consider supporting us by giving a ⭐ star to the repository.

Question Link
discussion section
rishabhv12/Daily-Leetcode-Solution