设计一个算法,使第一个链表中仅留下三个表中均包含的结点,且没有数据值相同的结点,并释放LA中其他结点。

三个带头结点的单链表,元素均递增有序(假设每个单链表不存在数据值相同的结,但三个表中成长数据相同的结点)。设计一个算法,使第一个链表中仅留下三个表中均包含的结点,且没有数据值相同的结点,并释放LA中其他结点。要求时间复杂度为O(m+n+p),m,n和p分别为三个表的长度。

思想:先以单链表LA 的头节点作为一个空表,r指向这个链表的尾结点,遍历LA中的数据结点,判断他是否在LB和LC中,若同时在,则表示是公共结点,连接到r后,否则删除。

代码:

void ComNode(LinkNode &LA,LinkNode LB,LinkNode LC){
	LinkNode *pa=LA->next,*pb=LB->next,pc=LC->next,*r,*q;
	LA->next=NULL;//此时LA作为新建链表的头结点 
	r=LA;//指向 新建链表的尾结点 
	
	while(pa!=NULL){
		//与B表进行比较 
		while(pb!=NULL&&pa->data>pb->data){
			pb=pb->next;
		}
		//与A表进行比较 
		while(pc!=NULL&&pa->data>pc->data){
			pc=pc->next;
		}
		//找到公共结点,进行插入 
		if(pb!=NULL&&pc!=NULL&&pa->data=pb->data&&pa->data==pc->data){
			r->next=pa;
			r=pa;
			pa=pa->next;
		}else{//不是公共结点进行删除 
			q=pa;
			pa=pa->next;
			free(q)
		}
	}
	r->next=NULL;//尾结点置空 
} 

时间复杂度O(m+n+p),空间复杂度O(1)

上一篇:Go语言开发环境搭建