- 题目描述:
-
输入两个链表,找出它们的第一个公共结点。
- 输入:
-
输入可能包含多个测试样例。
对于每个测试案例,输入的第一行为两个整数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
没找到原因