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

来源:互联网 发布:飞控led软件下载 编辑:程序博客网 时间:2024/05/16 07:44


题目描述:

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

输入:

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

输出:

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

样例输入:
5 41 2 3 6 74 5 6 73 31 5 72 4 72 31 34 5 6
样例输出:
67My 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头要为空,因为代码是这样写的




0 0
原创粉丝点击