diff --git a/lib_lista.c b/lib_lista.c
index df2079c885b25ebe8f6e0068d2ac5cab6da8767e..b8f4acc2532f86de7adb1489eb1282cecdfa3b49 100644
--- a/lib_lista.c
+++ b/lib_lista.c
@@ -12,7 +12,7 @@ int inicializa_lista(t_lista *l)
 		return 0;
 
 	sentinel->prox = NULL;
-	sentinel->prev = l->ini;
+	sentinel->prev = NULL;
 
 	l->ini = sentinel;
 	
diff --git a/lib_lista_complementar.c b/lib_lista_complementar.c
index 7480e823ee9bfdf2cdd8a3a48bae0b0fa3b21ec8..e846740023c29bc7f5777ae59a2db9b2c5f7503c 100644
--- a/lib_lista_complementar.c
+++ b/lib_lista_complementar.c
@@ -2,10 +2,6 @@
 
 #include "lib_lista.h"
 
-/*
-  Funcao que imprime todos os elementos da lista, do inicio ao fim.
-  Caso a lista seja vazia nao imprime nada, nem um \n
-*/
 void imprime_lista(t_lista *l)
 {
 	int item;
@@ -20,10 +16,6 @@ void imprime_lista(t_lista *l)
 	}
 }
 
-/*
-  Funcao que copia todos os elementos da lista l na lista c.
-  Retorna 1 se a operação foi bem sucedida e zero caso contrário.
-*/
 int copia_lista(t_lista *l, t_lista *c)
 {
 	int item;
@@ -45,11 +37,6 @@ int copia_lista(t_lista *l, t_lista *c)
 	return 1;
 }
 
-/*
-  Concatena os elementos da lista c (na mesma ordem) ao final
-  da lista l e destroi a lista c.
-  Retorna 1 se a operação foi bem sucedida e zero caso contrário.
-*/
 int concatena_listas(t_lista *l, t_lista *c)
 {
 	int item;
@@ -62,10 +49,6 @@ int concatena_listas(t_lista *l, t_lista *c)
 	return 1;
 }
 
-/*
-  Ordena a lista l em ordem crescente.
-  Retorna 1 se a operação foi bem sucedida e zero caso contrário.
-*/
 int ordena_lista(t_lista *l)
 {
 	t_lista aux;
@@ -86,9 +69,40 @@ int ordena_lista(t_lista *l)
 }
 
 /*
-  Funcao que cria uma nova lista i pela intercalacao dos elementos
-  das listas l e c. As listas l e c devem estar ordenadas.
-  Retorna 1 se a operação foi bem sucedida e zero caso contrário.
+	Assumindo que as listas l e m já estão ordenadas.
 */
-int intercala_listas(t_lista *l, t_lista *m, t_lista *i){return 1;}
+int intercala_listas(t_lista *l, t_lista *m, t_lista *i)
+{
+	if (!inicializa_lista (i))
+		return 0;
 
+	int item;
+	while (!lista_vazia(l) || !lista_vazia(m))
+	{
+		consulta_item_atual(&item, l);
+		incrementa_atual(l);
+		insere_inicio_lista(item, i);
+
+		consulta_item_atual(&item, m);
+		incrementa_atual(m);
+		insere_inicio_lista(item, i);
+	}
+
+	if (lista_vazia(l))
+		while (!lista_vazia(m))
+		{
+			consulta_item_atual(&item, m);
+			incrementa_atual(m);
+			insere_inicio_lista(item, i);
+		}
+
+	else
+		while (!lista_vazia(l))
+		{
+			consulta_item_atual(&item, l);
+			incrementa_atual(l);
+			insere_inicio_lista(item, i);
+		}
+
+	return 1;
+}
diff --git a/main.c b/main.c
index 2a77806723228894d95db1154b2dc8d8e1a80d4d..fde3c7d9f5faa5752e8ecbcfc470ddad25296a1c 100644
--- a/main.c
+++ b/main.c
@@ -4,9 +4,11 @@
 
 int main() 
 {
-	t_lista l, u;
+	t_lista l, u, w;
+
 	inicializa_lista(&l);
 	inicializa_lista(&u);
+	inicializa_lista(&w);
 
 	printf("insere inicio e fim:\n");
 	insere_inicio_lista(10,&l);
@@ -40,8 +42,15 @@ int main()
 	imprime_lista(&l);
 	printf("\n");
 
+	printf("intercala:\n");
+	intercala_listas(&l, &l, &w);
+	printf ("lista w: ");
+	imprime_lista(&w);
+	printf("\n");
+
 	destroi_lista(&l);
 	destroi_lista(&u);
+	destroi_lista(&w);
 
 	return 0;
 }