這個算法的思路是兩個指針分別指向兩個鏈表頭,然後才頭到尾遍歷,複雜度是O(min(Length(a),Length(b)),下面給出實現代碼,是用純C寫的鏈表實現,注意代碼中直接採用尾插法最後一個數據會超時,因爲鏈表尾插的時間複雜度是O(N),解決的辦法是創建一個尾節點
#include <stdio.h>
#include <stdlib.h>
#define ERROR NULL
typedef int ElementType;
typedef struct LNode *PtrToLNode;
struct LNode {
ElementType Data;
PtrToLNode Next;
};
typedef PtrToLNode Position;
typedef PtrToLNode List;
List MakeEmpty();
Position Find(List L, ElementType X);
bool Insert(List L, ElementType X, Position P);
bool Delete(List L, Position P);
void InsertTail(List L, ElementType X);
int main()
{
List L1 = MakeEmpty();
List L2 = MakeEmpty();
List L3 = MakeEmpty();
int temp;
while (1)
{
scanf_s("%d", &temp);
if (temp == -1)
break;
InsertTail(L1, temp);
}
while (1)
{
scanf_s("%d", &temp);
if (temp == -1)
break;
InsertTail(L2, temp);
}
PtrToLNode p, q;
p = L1->Next;
q = L2->Next;
while (p&&q)
{
if (p->Data == q->Data)
{
InsertTail(L3, p->Data);
p = p->Next;
q = q->Next;
}
else if (p->Data > q->Data)
{
q = q->Next;
}
else if (p->Data < q->Data)
{
p = p->Next;
}
}
p = L3->Next;
if (p == NULL)
printf("NULL\n");
else
{
printf("%d", p->Data);
while (p)
{
p = p->Next;
if(p)
printf(" %d", p->Data);
}
}
}
List MakeEmpty()
{
List L = (List)malloc(sizeof(struct LNode));
L->Next = NULL;
return L;
}
Position Find(List L, ElementType X)
{
PtrToLNode p;
p = L->Next;
while (p)
{
if (p->Data == X)
return p;
p = p->Next;
}
return p;
}
bool Insert(List L, ElementType X, Position P)
{
PtrToLNode p, temp;
p = L;
while (p&&p->Next != P)
{
p = p->Next;
}
if (p == NULL)
{
printf("Wrong Position for Insertion\n");
return false;
}
temp = (PtrToLNode)malloc(sizeof(struct LNode));
temp->Data = X;
temp->Next = p->Next;
p->Next = temp;
return true;
}
bool Delete(List L, Position P)
{
PtrToLNode p, temp;
p = L;
while (p&&p->Next != P)
{
p = p->Next;
}
if (p == NULL)
{
printf("Wrong Position for Deletion\n");
return false;
}
temp = p->Next;
p->Next = temp->Next;
free(temp);
return true;
}
void InsertTail(List L, ElementType X)
{
PtrToLNode p, temp;
p = L;
while (p->Next)
{
p = p->Next;
}
temp = (PtrToLNode)malloc(sizeof(struct LNode));
temp->Data = X;
temp->Next = NULL;
p->Next = temp;
}