C语言 两个有序链表序列的交集

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

 

 

    原文作者:算法
    原文地址: https://www.twblogs.net/a/5bd39e682b717778ac209814
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞