现在的位置: 首页 > 综合 > 正文

题目1505:两个链表的第一个公共结点

2017年12月25日 ⁄ 综合 ⁄ 共 2814字 ⁄ 字号 评论关闭
题目描述:

输入两个链表,找出它们的第一个公共结点。

输入:

输入可能包含多个测试样例。
对于每个测试案例,输入的第一行为两个整数m和n(1<=m,n<=1000):代表将要输入的两个链表的元素的个数。
接下来的两行,第一行为第一个链表的所有元素,中间用空格隔开。第二行为第二个链表的所有元素,中间用空格隔开。

输出:

对应每个测试案例,
输出两个链表的第一个公共结点的值。
如果两个链表没有公共结点,则输出“My God”。

样例输入:
5 4
1 2 3 6 7
4 5 6 7
3 3
1 5 7
2 4 7
2 3
1 3
4 5 6
样例输出:
6
7
My God
#include <cstdio>
#include <cstdlib>

typedef struct _LinkNode
{
	int value;
	struct _LinkNode *next;
}LinkNode;

LinkNode* JudgeCommonNodeInLink(LinkNode *first_link,LinkNode *second_link)
{
	if(first_link == NULL || second_link == NULL)
	{
		printf("My God\n");
		return NULL;
	}
	int length_of_first_link = 0,length_of_second_link = 0;
	LinkNode *A = first_link,*B = second_link;
	LinkNode *a_pre,*b_pre;
	while(first_link)
	{
		length_of_first_link++;
		a_pre = first_link;
		first_link = first_link->next;
	}
	while(second_link)
	{
		length_of_second_link++;
		b_pre = second_link;
		second_link = second_link->next;		
	}	
	if(a_pre != b_pre)
	{
		printf("My God\n");
		return NULL;
	}
	int sub_length ;
	if(length_of_first_link > length_of_second_link)
	{
		sub_length = length_of_first_link - length_of_second_link;
		while(sub_length)
		{
			A = A->next;
			sub_length--;
		}
	}
	else if(length_of_first_link < length_of_second_link)
	{
		sub_length = length_of_second_link - length_of_first_link;
		while(sub_length)
		{
			B = B->next;
			sub_length--;
		}	
	}
	while(A)
	{
		if(A!=B)
		{
			A = A->next;
			B = B->next;
		}
		else
		{
			break;
		}
	}
	printf("%d\n",A->value);
	return A;
}

int CreateLinkFromTwoArray(int *array_a,int length_a,int *array_b,int length_b,LinkNode **link_a,LinkNode **link_b)
{
	if(length_a == 0 || length_b == 0 || array_a == NULL || array_b == NULL || link_a == NULL || link_b == NULL)
	{
		return 0;
	}
	length_a--;
	length_b--;
	LinkNode *comm_head = NULL,*current_node = NULL;
	while(*(array_a+length_a) == *(array_b+length_b)&&length_a>=0&&length_b>=0)
	{
		current_node = (LinkNode *)malloc(sizeof(LinkNode));
		current_node->value = *(array_a+length_a);
		current_node->next = comm_head;
		comm_head = current_node;
		length_a--;
		length_b--;
	}
	length_a++;
	length_b++;
	*link_a = comm_head;
	*link_b = comm_head;
	LinkNode *head_a = NULL,*head_b = NULL;
	while(length_a)
	{
		length_a--;
		head_a = (LinkNode *)malloc(sizeof(LinkNode));
		head_a->value = *(array_a+length_a);
		head_a->next = *link_a;
		*link_a = head_a;
	}
	while(length_b)
	{
		length_b--;
		head_b = (LinkNode *)malloc(sizeof(LinkNode));
		head_b->value = *(array_b+length_b);
		head_b->next = *link_b;
		*link_b = head_b;
	}
	return 1;
}

void FreeLinksWithCommNode(LinkNode *linkA,LinkNode *linkB,LinkNode *comm_node)
{
	LinkNode *tmp;
	while(linkA)
	{
		tmp = linkA->next;
		free(linkA);
		linkA = tmp;
	}
	while(linkB!=comm_node)
	{
		tmp = linkB->next;
		free(linkB);
		linkB = tmp;
	}
}

int main(int argc,char** argv)
{
	int m ,n,i;
	int array_a[1000];
	int array_b[1000];
	LinkNode *head_a = NULL;
	LinkNode *head_b = NULL;
	LinkNode *common_node = NULL;
	while(scanf("%d%d",&m,&n)!=EOF)
	{
		i = 0;
		while(i<m)
		{
			scanf("%d",&array_a[i]);
			i++;
		}
		i = 0;
		while(i<n)
		{
			scanf("%d",&array_b[i]);
			i++;
		}
		common_node = NULL;
		head_a = NULL;
		head_b = NULL;
		if(CreateLinkFromTwoArray(array_a,m,array_b,n,&head_a,&head_b))
		{
			common_node = JudgeCommonalityNodeInLink(head_a,head_b);
		}
		FreeLinksWithCommNode(head_a,head_b,JudgeCommonNodeInLink);			
	}
}

除了第一个用例,别的都WRONGANSWER

没找到原因

抱歉!评论已关闭.