Dadas dos listas vinculadas, inserte Nodes de la segunda lista en la primera lista en posiciones alternativas de la primera lista.
Por ejemplo, si la primera lista es 5->7->17->13->11 y la segunda es 12->10->2->4->6, la primera lista debería convertirse en 5->12->7- >10->17->2->13->4->11->6 y la segunda lista debería quedar vacía. Los Nodes de la segunda lista solo deben insertarse cuando haya posiciones disponibles. Por ejemplo, si la primera lista es 1->2->3 y la segunda lista es 4->5->6->7->8, entonces la primera lista debería convertirse en 1->4->2->5 ->3->6 y la segunda lista a 7->8.
No se permite el uso de espacio adicional (no se permite crear Nodes adicionales), es decir, la inserción debe realizarse en el lugar. La complejidad de tiempo esperada es O(n) donde n es un número de Nodes en la primera lista.
La idea es ejecutar un bucle mientras haya posiciones disponibles en el primer bucle e insertar Nodes de la segunda lista cambiando los punteros. Las siguientes son implementaciones de este enfoque.
Javascript
<script> // Javascript program to merge a linked list // into another at alternate positions // A nexted list node class Node { constructor() { this.data = 0; this.next = null; } }; /* Function to insert a node at the beginning */ function push(head_ref, new_data) { var new_node = new Node(); new_node.data = new_data; new_node.next = (head_ref); (head_ref) = new_node; return head_ref; } /* Utility function to print a singly linked list */ function printList(head) { var temp = head; while (temp != null) { document.write( temp.data + " "); temp = temp.next; } document.write("<br>"); } // Main function that inserts nodes of // linked list q into p at alternate // positions. Since head of first list // never changes and head of second list // may change, we need single pointer for // first list and double pointer for second // list. function merge(p, q) { var p_curr = p, q_curr = q; var p_next, q_next; // While there are available positions // in p while (p_curr != null && q_curr != null) { // Save next pointers p_next = p_curr.next; q_next = q_curr.next; // Make q_curr as next of p_curr // Change next pointer of q_curr q_curr.next = p_next; // Change next pointer of p_curr p_curr.next = q_curr; // Update current pointers for next // iteration p_curr = p_next; q_curr = q_next; } // Update head pointer of second list q = q_curr; return q; } // Driver code var p = null, q = null; p = push(p, 3); p = push(p, 2); p = push(p, 1); document.write( "First Linked List:<br>"); printList(p); q = push(q, 8); q = push(q, 7); q = push(q, 6); q = push(q, 5); q = push(q, 4); document.write( "Second Linked List:<br>"); printList(q); q = merge(p, q); document.write( "Modified First Linked List:<br>"); printList(p); document.write( "Modified Second Linked List:<br>"); printList(q); // This code is contributed by rrrtnx. </script>
Producción:
First Linked List: 1 2 3 Second Linked List: 4 5 6 7 8 Modified First Linked List: 1 4 2 5 3 6 Modified Second Linked List: 7 8
Complejidad de tiempo: O(N)
Espacio Auxiliar: O(1)
Consulte el artículo completo sobre Fusionar una lista vinculada en otra lista vinculada en posiciones alternativas 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