Comprobar si dos listas enlazadas son anagramas o no

Dadas dos strings en forma de listas enlazadas, la tarea es verificar si una string es el anagrama de la otra. Escriba si lo son, de lo contrario escriba No.

Ejemplos:

Entrada: 
Lista enlazada 1 = T->R->I->A->N->G->L->E->NULL
Lista enlazada 2 = I->N->T->E->G-> R->A->L->NULL
Salida:
Explicación: Las dos strings dadas son anagramas ya que tienen los mismos caracteres presentes en tiempos iguales.

Entrada:
Lista enlazada 1 = S->I->L->E->N->T->NULL
Lista enlazada 2 = L->I->S->T->E->N->NULL
Salida:

 

Enfoque: este problema se puede resolver ordenando las listas vinculadas y luego verificando que ambas sean idénticas o no. Si son idénticos después de clasificarlos, entonces son anagramas. De lo contrario, no lo son. Ahora siga los pasos a continuación para resolver este problema:

  1. Ordene ambas listas vinculadas utilizando la ordenación de burbujas.
  2. Ahora, recorra ambas listas vinculadas desde el principio y haga coincidir cada Node correspondiente.
  3. Si dos Nodes correspondientes son diferentes, imprima No y regrese.
  4. Imprima al final después de que termine el bucle.

A continuación se muestra la implementación del enfoque anterior:

C++14

// C++ program for the above approach
#include <iostream>
using namespace std;
  
// Structure for a node
struct Node {
    int data;
    Node* next;
} Node;
  
// Function to swap the nodes
struct Node* swap(struct Node* ptr1, 
                  struct Node* ptr2)
{
    struct Node* tmp = ptr2->next;
    ptr2->next = ptr1;
    ptr1->next = tmp;
    return ptr2;
}
  
// Function to sort the list
void bubbleSort(struct Node*** head, 
                int count)
{
    struct Node** h;
    int i, j, swapped;
  
    for (i = 0; i <= count; i++) {
  
        h = *head;
        swapped = 0;
  
        for (j = 0; j < count - i - 1; 
             j++) {
  
            struct Node* p1 = *h;
            struct Node* p2 = p1->next;
  
            if (p1->data > p2->data) {
  
                // Update the link 
                // after swapping
                *h = swap(p1, p2);
                swapped = 1;
            }
  
            h = &(*h)->next;
        }
  
        // Break if the loop ended 
        // without any swap
        if (swapped == 0)
            break;
    }
}
  
// Function to insert a struct Node
// at the end of a linked list
void insert(struct Node*** head, int data)
{
    struct Node* ptr = new struct Node();
  
    ptr->data = data;
    ptr->next = NULL;
    if (**head == NULL) {
        **head = ptr;
    }
    else {
        struct Node* ptr1 = **head;
        while (ptr1->next != NULL) {
            ptr1 = ptr1->next;
        }
        ptr1->next = ptr;
    }
}
  
// Function to check if both strings 
// are anagrams or not
bool checkAnagram(struct Node** head1, 
                  struct Node** head2,
                  int N, int M)
{
  
    // Sort the linked list
    bubbleSort(&head1, N);
    bubbleSort(&head2, M);
  
    struct Node* ptr1 = *head1;
    struct Node* ptr2 = *head2;
    int flag = 0;
    while (ptr1 != NULL) {
        if (ptr1->data == ptr2->data) {
            ptr1 = ptr1->next;
            ptr2 = ptr2->next;
        }
        else {
            return 0;
        }
    }
  
    // If one of the linked list
    // doesn't end
    if (!ptr1 and !ptr2) {
        return 1;
    }
  
    return 0;
}
  
// Function to create linked lists
// from the strings
void createLinkedList(struct Node** head1,
                      struct Node** head2, 
                      string s1, string s2)
{
  
    int N = s1.size();
    int M = s2.size();
  
    // Create linked list from the array s1
    for (int i = 0; i < N; i++) {
        insert(&head1, s1[i]);
    }
  
    // Create linked list from the array s2
    for (int i = 0; i < M; i++) {
        insert(&head2, s2[i]);
    }
}
  
// Driver Code
int main()
{
    string s1 = "TRIANGLE";
    string s2 = "INTEGRAL";
  
    int N = s1.size(), M = s2.size();
  
    // start with empty linked list
    struct Node* head1 = NULL;
    struct Node* head2 = NULL;
  
    createLinkedList(&head1, &head2, s1, s2);
  
    if (checkAnagram(&head1, &head2, N, M))
        cout << "Yes";
    else
        cout << "No";
  
    return 0;
}
Producción

Yes

Complejidad de Tiempo: O(N 2 )
Espacio Auxiliar: O(1)

Publicación traducida automáticamente

Artículo escrito por akshitsaxenaa09 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *