-
题目描述:
-
输入两个链表,找出它们的第一个公共结点。
-
输入:
-
输入可能包含多个测试样例。
对于每个测试案例,输入的第一行为两个整数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<iostream>
#include<limits.h>
using namespace std;
struct Node
{
int val;
Node *next;
Node(int value):val(value),next(NULL){}
};
void list_construct(Node **head, int len)
{
int i;
int val;
Node *p;
for(i=0;i<len;++i)
{
cin>>val;
if(NULL==*head)
{
*head = new Node(val);
p = *head;
}
else
{
p->next = new Node(val);
p = p->next;
}
}
return;
}
void list_print(Node *head)
{
while(head)
{
cout<<head->val;
head = head->next;
}
return;
}
int get_length(Node *head)
{
int len = 0;
while(head)
{
len++;
head = head->next;
}
return len;
}
int common_point(Node *list1, Node *list2)
{
int len1 = get_length(list1);
int len2 = get_length(list2);
Node *p;
int len;
if(len1<len2)
{
p = list2;
list2 = list1;
list1 = p;
len = len2;
len2 = len1;
len1 = len;
}
len = len1 - len2;
while(len--)
list1 = list1->next;
while(list1||list2)
{
if(list1->val==list2->val)
return list1->val;
else
{
list1 = list1->next;
list2 = list2->next;
}
}
if(list1==NULL)
return INT_MIN;
}
int main()
{
int m,n;
Node *list1, *list2;//list must be null,each loop
int result;
while(cin>>m>>n)
{
list1 = list2 = NULL; //代码中要求是初始为NULL,否则报错 不初始默认不是NULL
list_construct(&list1,m);
list_construct(&list2,n);
// list_print(list1);
// list_print(list2);
result = common_point(list1,list2);
if(result==INT_MIN)
cout<<"My God"<<endl;
else
cout<<result<<endl;
}
return 0;
}
此题难点不在算法,而在于链表的构建与处理上
1. 构建时,void list_construct(Node **head, int len);
注意Node **head
2. 求长度和其它
两链表长度的处理,把长的放在前面,好控制
3. 当构建时,两个list头要为空,因为代码是这样写的