这个算法的思路是两个指针分别指向两个链表头,然后才头到尾遍历,复杂度是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;
}