Lectura
Suma máxima de gemelos de una lista enlazada (Java, Python, PHP, C++, JavaScript)
El ejercicio consiste en encontrar la suma máxima de pares de nodos en su posición gemelo en una lista enlazada.
Las posiciones gemelo cumplen la condición de, dado una posición i, se tendrá la posición n-1-i donde:
* n es el total de elementos de la lista
* i es la posición actual del nodo.
Como se puede apreciar en el ejemplo, la posición 0 es gemela de la posición 3, Ya que el tamaño total de la lista es 4 y la posición actual es 0, así que, se realiza el cálculo que en este caso es 4-1-0 y da como resultado 3, su posición gemela.
Igualmente para la posición 1, ya que 4-1-1 es 2, osea el siguiente nodo y su posición gemela
Explicación del ejercicio Paso por paso
Código de la solución
Java
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public int pairSum(ListNode head) {
ListNode slow = head;
ListNode fast = head;
// Encontrar el punto medio de la lista
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
}
// Invertir la segunda mitad de la lista
ListNode prev = null;
ListNode curr = slow;
while (curr != null) {
ListNode nextTemp = curr.next;
curr.next = prev;
prev = curr;
curr = nextTemp;
}
// Calcular la suma máxima entre los pares gemelos
int maxSum = 0;
ListNode first = head;
ListNode second = prev;
while (second != null) {
maxSum = Math.max(maxSum, first.val + second.val);
first = first.next;
second = second.next;
}
return maxSum;
}
}
Python
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution(object):
def pairSum(self, head):
slow = head
fast = head
# Encontrar el punto medio
while fast and fast.next:
slow = slow.next
fast = fast.next.next
# Invertir la segunda mitad
prev = None
curr = slow
while curr:
next_temp = curr.next
curr.next = prev
prev = curr
curr = next_temp
# Calcular la suma máxima de gemelos
max_sum = 0
first = head
second = prev
while second:
max_sum = max(max_sum, first.val + second.val)
first = first.next
second = second.next
return max_sum
PHP
/**
* Definition for a singly-linked list.
* class ListNode {
* public $val = 0;
* public $next = null;
* function __construct($val = 0, $next = null) {
* $this->val = $val;
* $this->next = $next;
* }
* }
*/
class Solution {
/**
* @param ListNode $head
* @return Integer
*/
function pairSum($head) {
$slow = $head;
$fast = $head;
while ($fast !== null && $fast->next !== null) {
$slow = $slow->next;
$fast = $fast->next->next;
}
$prev = null;
$curr = $slow;
while ($curr !== null) {
$nextTemp = $curr->next;
$curr->next = $prev;
$prev = $curr;
$curr = $nextTemp;
}
$maxSum = 0;
$first = $head;
$second = $prev;
while ($second !== null) {
$maxSum = max($maxSum, $first->val + $second->val);
$first = $first->next;
$second = $second->next;
}
return $maxSum;
}
}
C++
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
int pairSum(ListNode* head) {
ListNode* slow = head;
ListNode* fast = head;
while (fast && fast->next) {
slow = slow->next;
fast = fast->next->next;
}
ListNode* prev = nullptr;
ListNode* curr = slow;
while (curr) {
ListNode* nextTemp = curr->next;
curr->next = prev;
prev = curr;
curr = nextTemp;
}
int maxSum = 0;
ListNode* first = head;
ListNode* second = prev;
while (second) {
maxSum = max(maxSum, first->val + second->val);
first = first->next;
second = second->next;
}
return maxSum;
}
};
JavaScript
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @return {number}
*/
var pairSum = function(head) {
let slow = head;
let fast = head;
while (fast && fast.next) {
slow = slow.next;
fast = fast.next.next;
}
let prev = null;
let curr = slow;
while (curr) {
let nextTemp = curr.next;
curr.next = prev;
prev = curr;
curr = nextTemp;
}
let maxSum = 0;
let first = head;
let second = prev;
while (second) {
maxSum = Math.max(maxSum, first.val + second.val);
first = first.next;
second = second.next;
}
return maxSum;
};
Si te gustó el contenido, ¡visita mi canal de YouTube para ver más explicaciones sobre algoritmos y estructuras de datos!