面试题37—两个链表的第一个公共结点

**题目:输入两个链表,找出他们第一个公共结点。
代码示例:**

#include<iostream>
using namespace std;
struct Node
{
    int data;
    Node *next;
};
class List
{
    Node *head;
public:
    List()
    {
        head = NULL;
    }
    ~List();
    void CreateList(int a[], int n);
    void Disp(void);
    int length(void);
    friend bool FirstParent(List &list1, List &list2,int &e);
};
List::~List(void)
{
    Node *p = head;
    while (p)
    {
        Node *q = p->next;
        delete p;
        p = q;
    }
}
void List::CreateList(int a[], int n)
{
    if (a == NULL || n <= 0)
        return;

    head = new Node();
    head->data = a[0];

    Node *current = head;
    for (int i = 1; i < n; i++)
    {
        Node *p = new Node();
        p->data = a[i];
        current->next = p;
        current = p;
    }
    current->next = NULL;
}
void List::Disp(void)
{
    Node *p = head;
    while (p)
    {
        cout << p->data << " ";
        p = p->next;
    }
    cout << endl;
} 
int List::length(void)
{
    Node *p = head;
    int len = 0;
    while (p)
    {
        len++;
        p = p->next;
    }
    return len;
}
bool FirstParent( List &list1, List &list2, int &e)
{
    int len1 = list1.length();
    int len2 = list2.length();
    int lendif;
    int len;
    Node *P1 = NULL;
    Node *P2 = NULL;
    if (len1 > len2)
    {
        lendif = len1 - len2;
        len = len2;
        P1 = list1.head;
        P2 = list2.head;
    }
    else if (len1 < len2)
    {
        lendif = len2 - len2;
        len = len1;
        P1 = list2.head;
        P2 = list1.head;
    }
    else
    {
        if (list1.head == list2.head)
        {
            e = list1.head->data;
            return true;
        }
        else
            return false;
    }

    for (int i = 0; i < lendif; i++)
        P1 = P1->next;

    for (int i = 0; i < len; i++)
    {
        if (P1 != P2)
        {
            P1 = P1->next;
            P2 = P2->next;
        }
        else
        {
            e = P1->data;
            return true;
        }
    }
    return false;
}


int main()
{
    const int n1 = 7;
    const int n2 = 3;
    int a1[n1] = { 1,8,6,20,-4,52,8 };
    int a2[n2] = { 3,0,5 };

    List mylist1, mylist2;
    mylist1.CreateList(a1, n1);
    mylist2.CreateList(a2, n2);
    cout << "链表1:";
    mylist1.Disp();
    cout << "链表2:";
    mylist2.Disp();
    //===
    int e = -1;
    bool flag = FirstParent(mylist1, mylist2,e);
    if (flag)
    {
        cout << "两个链表的第一个公共结点是:" << e << endl;
    }
    else
    {
        cout << "两个链表没有公共结点!"<< endl;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值