{x}
blog image

Maximum Twin Sum of a Linked List

In a linked list of size n, where n is even, the ith node (0-indexed) of the linked list is known as the twin of the (n-1-i)th node, if 0 <= i <= (n / 2) - 1.

  • For example, if n = 4, then node 0 is the twin of node 3, and node 1 is the twin of node 2. These are the only nodes with twins for n = 4.

The twin sum is defined as the sum of a node and its twin.

Given the head of a linked list with even length, return the maximum twin sum of the linked list.

 

Example 1:

Input: head = [5,4,2,1]
Output: 6
Explanation:
Nodes 0 and 1 are the twins of nodes 3 and 2, respectively. All have twin sum = 6.
There are no other nodes with twins in the linked list.
Thus, the maximum twin sum of the linked list is 6. 

Example 2:

Input: head = [4,2,2,3]
Output: 7
Explanation:
The nodes with twins present in this linked list are:
- Node 0 is the twin of node 3 having a twin sum of 4 + 3 = 7.
- Node 1 is the twin of node 2 having a twin sum of 2 + 2 = 4.
Thus, the maximum twin sum of the linked list is max(7, 4) = 7. 

Example 3:

Input: head = [1,100000]
Output: 100001
Explanation:
There is only one node with a twin in the linked list having twin sum of 1 + 100000 = 100001.

 

Constraints:

  • The number of nodes in the list is an even integer in the range [2, 105].
  • 1 <= Node.val <= 105

Problem Description

The problem asks to find the maximum twin sum in a linked list with an even number of nodes. The twin of the ith node is the (n-1-i)th node, where n is the length of the linked list. The twin sum is the sum of a node and its twin.

Solution Approach

There are two main approaches to solve this problem:

Approach 1: Using an Array

  1. Traverse and Store: First, traverse the linked list and store all node values in an array.
  2. Calculate Twin Sums: Iterate through the first half of the array. For each element at index i, calculate the twin sum by adding it to the element at index n - 1 - i, where n is the length of the array.
  3. Find Maximum: Keep track of the maximum twin sum encountered during the iteration.

Approach 2: Reversing the Second Half and Iterating

  1. Find Middle: Traverse the linked list using two pointers (slow and fast) to find the middle of the list.
  2. Reverse Second Half: Reverse the second half of the linked list.
  3. Iterate and Sum: Iterate through the first half and the reversed second half simultaneously. For each pair of nodes, calculate the twin sum and update the maximum twin sum if necessary.

Time and Space Complexity Analysis

Approach 1:

  • Time Complexity: O(n), where n is the number of nodes in the linked list. This is because we traverse the list once to store the values in an array and then iterate through half of the array to calculate twin sums.
  • Space Complexity: O(n), as we use an array to store the node values.

Approach 2:

  • Time Complexity: O(n). We traverse the list to find the middle (O(n)), reverse the second half (O(n)), and then iterate through half the list again (O(n)). The overall complexity remains O(n).
  • Space Complexity: O(1). We use only a few pointers, so the space used is constant regardless of the input size.

Code Implementation (with detailed comments)

Here's the implementation of both approaches in Python:

Approach 1: Using an Array

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
 
class Solution:
    def pairSum(self, head: Optional[ListNode]) -> int:
        vals = []  # List to store node values
        curr = head
        while curr:
            vals.append(curr.val)
            curr = curr.next
 
        n = len(vals)
        max_twin_sum = 0
        for i in range(n // 2):  # Iterate through the first half
            twin_sum = vals[i] + vals[n - 1 - i]
            max_twin_sum = max(max_twin_sum, twin_sum)
 
        return max_twin_sum

Approach 2: Reversing the Second Half

class Solution:
    def pairSum(self, head: Optional[ListNode]) -> int:
        # Helper function to reverse a linked list
        def reverse(head):
            prev = None
            curr = head
            while curr:
                next_node = curr.next
                curr.next = prev
                prev = curr
                curr = next_node
            return prev
 
        # Find the middle of the linked list
        slow = head
        fast = head
        while fast and fast.next:
            slow = slow.next
            fast = fast.next.next
 
        # Reverse the second half
        second_half = reverse(slow.next)
        slow.next = None  # Separate the first and second halves
 
        # Iterate and find the maximum twin sum
        max_twin_sum = 0
        first_half = head
        while first_half and second_half:
            twin_sum = first_half.val + second_half.val
            max_twin_sum = max(max_twin_sum, twin_sum)
            first_half = first_half.next
            second_half = second_half.next
 
        return max_twin_sum

The other languages (Java, C++, Go, TypeScript, Rust) would follow similar logic, adapting the syntax and data structures accordingly. Remember to include the ListNode definition in your code if it's not already provided by the LeetCode environment.