#include <stdio.h>
#include <stdlib.h>
#define true 1
#define false 0
 
 
typedef struct _nodo{
    int data;
    struct _nodo *next;
    struct _nodo *prev;
}nodo;
 
 
typedef struct _lista{
    nodo *head;
}lista;
 
 
lista *criaLista(){
    lista 
*l 
= (lista
*)malloc(sizeof(lista
));    if (l != NULL){
        l->head = NULL;
        return l;
    }
    return NULL;
}
 
 
nodo *criaNodo(int data){
    nodo 
*n 
= (nodo
*)malloc(sizeof(nodo
));    if (n != NULL){
        n->data = data;
        n->next = NULL;
        n->prev = NULL;
        return n;
    }
    return NULL;
}
 
 
int inserirFim(lista *l, int data){
    if (l == NULL) return false; //o teste de lista NULL logo aqui no topo
 
    nodo *n = criaNodo(data);
 
    if (l->head == NULL){
        l->head = n;
        n->next = n->prev = n;
    }
    else{
        n->next = l->head;
        n->prev = l->head->prev;
        l->head->prev->next = n;
        l->head->prev = n;
    }
    return true; //retorno true so uma vez
}
 
 
void display(lista *l){
    if (l != NULL && l->head != NULL){
        nodo *temp = l->head;
        while (temp->next != l->head){
            temp = temp->next;
        }
    }
}
 
 
lista *intersecao(lista *l, lista *l1){
    if (l != NULL && l->head != NULL && l1 != NULL && l1->head != NULL){
        lista *l2 = criaLista();
        nodo *temp = l->head->next;
        nodo *temp1 = l1->head->next;
 
        inserirFim(l2, l->head->data);
        inserirFim(l2, l1->head->data);
 
 
        while (temp != l->head && temp1 != l1->head){
            inserirFim(l2, temp->data);
            inserirFim(l2, temp1->data);
            temp = temp->next;
            temp1 = temp1->next;
        }
 
        if (temp == l->head) {
            temp = temp1;
            l = l1;
        }
 
        while (temp != l->head){
            inserirFim(l2, temp->data);
            temp = temp->next;
        }
 
        return l2;
    }
 
    return NULL; //estava em falta
}
 
int main()
{
        //desconsidera a main, era só pra testar se tava funcionando.
        // por isso ja inserir os numeros ordenados
 
    lista *l = criaLista();
    lista *l1 = criaLista();
 
    inserirFim(l, 100);
    inserirFim(l, 90);
    inserirFim(l, 80);
    inserirFim(l, 70);
    inserirFim(l, 60);
    inserirFim(l, 50);
    inserirFim(l, 40);
 
    display(l);
 
    inserirFim(l1, 100);
    inserirFim(l1, 70);
    inserirFim(l1, 50);
    inserirFim(l1, 40);
 
    display(l1);
 
    lista *l3 = intersecao(l1, l);
 
    display(l3);
 
    return 0;
}
 
				I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2RlZmluZSB0cnVlIDEKI2RlZmluZSBmYWxzZSAwCgoKdHlwZWRlZiBzdHJ1Y3QgX25vZG97CiAgICBpbnQgZGF0YTsKICAgIHN0cnVjdCBfbm9kbyAqbmV4dDsKICAgIHN0cnVjdCBfbm9kbyAqcHJldjsKfW5vZG87CgoKdHlwZWRlZiBzdHJ1Y3QgX2xpc3RhewogICAgbm9kbyAqaGVhZDsKfWxpc3RhOwoKCmxpc3RhICpjcmlhTGlzdGEoKXsKICAgIGxpc3RhICpsID0gKGxpc3RhKiltYWxsb2Moc2l6ZW9mKGxpc3RhKSk7CiAgICBpZiAobCAhPSBOVUxMKXsKICAgICAgICBsLT5oZWFkID0gTlVMTDsKICAgICAgICByZXR1cm4gbDsKICAgIH0KICAgIHJldHVybiBOVUxMOwp9CgoKbm9kbyAqY3JpYU5vZG8oaW50IGRhdGEpewogICAgbm9kbyAqbiA9IChub2RvKiltYWxsb2Moc2l6ZW9mKG5vZG8pKTsKICAgIGlmIChuICE9IE5VTEwpewogICAgICAgIG4tPmRhdGEgPSBkYXRhOwogICAgICAgIG4tPm5leHQgPSBOVUxMOwogICAgICAgIG4tPnByZXYgPSBOVUxMOwogICAgICAgIHJldHVybiBuOwogICAgfQogICAgcmV0dXJuIE5VTEw7Cn0KCgppbnQgaW5zZXJpckZpbShsaXN0YSAqbCwgaW50IGRhdGEpewogICAgaWYgKGwgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOyAvL28gdGVzdGUgZGUgbGlzdGEgTlVMTCBsb2dvIGFxdWkgbm8gdG9wbwoKICAgIG5vZG8gKm4gPSBjcmlhTm9kbyhkYXRhKTsKCiAgICBpZiAobC0+aGVhZCA9PSBOVUxMKXsKICAgICAgICBsLT5oZWFkID0gbjsKICAgICAgICBuLT5uZXh0ID0gbi0+cHJldiA9IG47CiAgICB9CiAgICBlbHNlewogICAgICAgIG4tPm5leHQgPSBsLT5oZWFkOwogICAgICAgIG4tPnByZXYgPSBsLT5oZWFkLT5wcmV2OwogICAgICAgIGwtPmhlYWQtPnByZXYtPm5leHQgPSBuOwogICAgICAgIGwtPmhlYWQtPnByZXYgPSBuOwogICAgfQogICAgcmV0dXJuIHRydWU7IC8vcmV0b3JubyB0cnVlIHNvIHVtYSB2ZXoKfQoKCnZvaWQgZGlzcGxheShsaXN0YSAqbCl7CiAgICBpZiAobCAhPSBOVUxMICYmIGwtPmhlYWQgIT0gTlVMTCl7CiAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIG5vZG8gKnRlbXAgPSBsLT5oZWFkOwogICAgICAgIHdoaWxlICh0ZW1wLT5uZXh0ICE9IGwtPmhlYWQpewogICAgICAgICAgICBwcmludGYoIiVkICIsIHRlbXAtPmRhdGEpOwogICAgICAgICAgICB0ZW1wID0gdGVtcC0+bmV4dDsKICAgICAgICB9CiAgICAgICAgcHJpbnRmKCIlZCAiLCB0ZW1wLT5kYXRhKTsKICAgIH0KfQoKCmxpc3RhICppbnRlcnNlY2FvKGxpc3RhICpsLCBsaXN0YSAqbDEpewogICAgaWYgKGwgIT0gTlVMTCAmJiBsLT5oZWFkICE9IE5VTEwgJiYgbDEgIT0gTlVMTCAmJiBsMS0+aGVhZCAhPSBOVUxMKXsKICAgICAgICBsaXN0YSAqbDIgPSBjcmlhTGlzdGEoKTsKICAgICAgICBub2RvICp0ZW1wID0gbC0+aGVhZC0+bmV4dDsKICAgICAgICBub2RvICp0ZW1wMSA9IGwxLT5oZWFkLT5uZXh0OwoKICAgICAgICBpbnNlcmlyRmltKGwyLCBsLT5oZWFkLT5kYXRhKTsKICAgICAgICBpbnNlcmlyRmltKGwyLCBsMS0+aGVhZC0+ZGF0YSk7CgoKICAgICAgICB3aGlsZSAodGVtcCAhPSBsLT5oZWFkICYmIHRlbXAxICE9IGwxLT5oZWFkKXsKICAgICAgICAgICAgaW5zZXJpckZpbShsMiwgdGVtcC0+ZGF0YSk7CiAgICAgICAgICAgIGluc2VyaXJGaW0obDIsIHRlbXAxLT5kYXRhKTsKICAgICAgICAgICAgdGVtcCA9IHRlbXAtPm5leHQ7CiAgICAgICAgICAgIHRlbXAxID0gdGVtcDEtPm5leHQ7CiAgICAgICAgfQoKICAgICAgICBpZiAodGVtcCA9PSBsLT5oZWFkKSB7CiAgICAgICAgICAgIHRlbXAgPSB0ZW1wMTsKICAgICAgICAgICAgbCA9IGwxOwogICAgICAgIH0KCiAgICAgICAgd2hpbGUgKHRlbXAgIT0gbC0+aGVhZCl7CiAgICAgICAgICAgIGluc2VyaXJGaW0obDIsIHRlbXAtPmRhdGEpOwogICAgICAgICAgICB0ZW1wID0gdGVtcC0+bmV4dDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBsMjsKICAgIH0KCiAgICByZXR1cm4gTlVMTDsgLy9lc3RhdmEgZW0gZmFsdGEKfQoKaW50IG1haW4oKQp7CiAgICAgICAgLy9kZXNjb25zaWRlcmEgYSBtYWluLCBlcmEgc8OzIHByYSB0ZXN0YXIgc2UgdGF2YSBmdW5jaW9uYW5kby4KICAgICAgICAvLyBwb3IgaXNzbyBqYSBpbnNlcmlyIG9zIG51bWVyb3Mgb3JkZW5hZG9zCgogICAgbGlzdGEgKmwgPSBjcmlhTGlzdGEoKTsKICAgIGxpc3RhICpsMSA9IGNyaWFMaXN0YSgpOwoKICAgIGluc2VyaXJGaW0obCwgMTAwKTsKICAgIGluc2VyaXJGaW0obCwgOTApOwogICAgaW5zZXJpckZpbShsLCA4MCk7CiAgICBpbnNlcmlyRmltKGwsIDcwKTsKICAgIGluc2VyaXJGaW0obCwgNjApOwogICAgaW5zZXJpckZpbShsLCA1MCk7CiAgICBpbnNlcmlyRmltKGwsIDQwKTsKCiAgICBkaXNwbGF5KGwpOwoKICAgIGluc2VyaXJGaW0obDEsIDEwMCk7CiAgICBpbnNlcmlyRmltKGwxLCA3MCk7CiAgICBpbnNlcmlyRmltKGwxLCA1MCk7CiAgICBpbnNlcmlyRmltKGwxLCA0MCk7CgogICAgZGlzcGxheShsMSk7CgogICAgbGlzdGEgKmwzID0gaW50ZXJzZWNhbyhsMSwgbCk7CgogICAgZGlzcGxheShsMyk7CgogICAgcHJpbnRmKCJcblxuIik7CiAgICBzeXN0ZW0oInBhdXNlIik7CiAgICByZXR1cm4gMDsKfQo=