Dadas tres listas enlazadas, digamos a, b y c, encuentre un Node de cada lista tal que la suma de los valores de los Nodes sea igual a un número dado.
Por ejemplo, si las tres listas enlazadas son 12->6->29, 23->5->8 y 90->20->59, y el número dado es 101, la salida debería ser triple “6 5 90 ”.
En las siguientes soluciones, se supone que el tamaño de las tres listas enlazadas es el mismo para simplificar el análisis. Las siguientes soluciones también funcionan para listas enlazadas de diferentes tamaños.
Un método simple para resolver este problema es ejecutar tres bucles anidados. El ciclo más externo toma un elemento de la lista a, el ciclo del medio toma un elemento de b y el ciclo más interno toma de c. El ciclo más interno también verifica si la suma de los valores de los Nodes actuales de a, b y c es igual al número dado. La complejidad temporal de este método será O(n^3).
La clasificación se puede utilizar para reducir la complejidad del tiempo a O(n*n). Los siguientes son los pasos detallados.
1) Ordenar la lista b en orden ascendente y la lista c en orden descendente.
2) Después de ordenar b y c, elija uno por uno un elemento de la lista a y encuentre el par recorriendo b y c. Consulte isSumSorted() en el siguiente código. La idea es similar al algoritmo cuadrático del problema de 3 sumas .
El siguiente código implementa solo el paso 2. La solución se puede modificar fácilmente para listas no ordenadas agregando el código de clasificación combinado que se analiza aquí .
Java
// Java program to find a triplet from three linked lists // with sum equal to a given number public class LinkedList { /* Linked list Node*/ public class Node { int data; Node next; public Node(int d) { this.data = d; next = null; } } public Node head; // head of list /* A function to check if there are three elements in * a, b and c whose sum is equal to givenNumber. The * function assumes that the list b is sorted in * ascending order and c is sorted in descending order. */ public boolean isSumSorted(LinkedList la, LinkedList lb, LinkedList lc, int givenNumber) { Node a = la.head; // Traverse all nodes of la while (a != null) { Node b = lb.head; Node c = lc.head; // for every node in la pick // 2 nodes from lb and lc while (b != null && c != null) { int sum = a.data + b.data + c.data; if (sum == givenNumber) { System.out.println( "Triplet Found: " + a.data + " " + b.data + " " + c.data); return true; } // If sum is smaller then // look for greater value of b else if (sum < givenNumber) { b = b.next; } else { c = c.next; } } a = a.next; } System.out.println("No Triplet found"); return false; } /* Given a reference (pointer to pointer) to the head of a list and an int, push a new node on the front of the list. */ public void push(int new_data) { /* 1 & 2: Allocate the Node & Put in the data*/ Node new_node = new Node(new_data); /* 3. Make next of new Node as head */ new_node.next = head; /* 4. Move the head to point to new Node */ head = new_node; } public static void main(String[] args) { LinkedList list1 = new LinkedList(); LinkedList list2 = new LinkedList(); LinkedList list3 = new LinkedList(); /* Create Linked List llist1 100->15->5->20 */ list1.push(20); list1.push(5); list1.push(15); list1.push(100); /*create a sorted linked list 'b' 2->4->9->10 */ list2.push(10); list2.push(9); list2.push(4); list2.push(2); /*create another sorted linked list 'c' 8->4->2->1 */ list3.push(1); list3.push(2); list3.push(4); list3.push(8); int givenNumber = 25; list1.isSumSorted(list1, list2, list3, givenNumber); } } // This code is contributed by lokesh (lokeshmvs21).
C#
// C# program to find a triplet // from three linked lists with // sum equal to a given number using System; public class LinkedList { public Node head; // head of list /* Linked list Node*/ public class Node { public int data; public Node next; public Node(int d) { data = d; next = null; } } /* A function to check if there are three elements in a, b and c whose sum is equal to givenNumber. The function assumes that the list b is sorted in ascending order and c is sorted in descending order. */ bool isSumSorted(LinkedList la, LinkedList lb, LinkedList lc, int givenNumber) { Node a = la.head; // Traverse all nodes of la while (a != null) { Node b = lb.head; Node c = lc.head; // for every node in la pick // 2 nodes from lb and lc while (b != null && c!=null) { int sum = a.data + b.data + c.data; if (sum == givenNumber) { Console.WriteLine("Triplet found " + a.data + " " + b.data + " " + c.data); return true; } // If sum is smaller then // look for greater value of b else if (sum < givenNumber) b = b.next; else c = c.next; } a = a.next; } Console.WriteLine("No Triplet found"); return false; } /* Given a reference (pointer to pointer) to the head of a list and an int, push a new node on the front of the list. */ void push(int new_data) { /* 1 & 2: Allocate the Node & Put in the data*/ Node new_node = new Node(new_data); /* 3. Make next of new Node as head */ new_node.next = head; /* 4. Move the head to point to new Node */ head = new_node; } /* Driver code*/ public static void Main(String []args) { LinkedList llist1 = new LinkedList(); LinkedList llist2 = new LinkedList(); LinkedList llist3 = new LinkedList(); /* Create Linked List llist1 100->15->5->20 */ llist1.push(20); llist1.push(5); llist1.push(15); llist1.push(100); /*create a sorted linked list 'b' 2->4->9->10 */ llist2.push(10); llist2.push(9); llist2.push(4); llist2.push(2); /*create another sorted linked list 'c' 8->4->2->1 */ llist3.push(1); llist3.push(2); llist3.push(4); llist3.push(8); int givenNumber = 25; llist1.isSumSorted(llist1,llist2,llist3,givenNumber); } } // This code contributed by Rajput-Ji
Producción:
Triplet Found: 15 2 8
Complejidad del tiempo: las listas enlazadas b y c se pueden ordenar en tiempo O (nLogn) usando Merge Sort (Ver esto ). El paso 2 toma el tiempo O(n*n). Entonces, la complejidad temporal general es O(nlogn) + O(nlogn) + O(n*n) = O(n*n).
En este enfoque, las listas enlazadas b y c se ordenan primero, por lo que se perderá su orden original. Si queremos conservar el orden original de b y c, podemos crear una copia de b y c.
¡ Consulte el artículo completo sobre Encontrar un triplete de tres listas vinculadas con una suma igual a un número dado para obtener más detalles!
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA