首页 > 代码库 > 【编程题目】编程判断俩个链表是否相交

【编程题目】编程判断俩个链表是否相交

第 7 题(链表)
微软亚院之编程判断俩个链表是否相交
给出俩个单向链表的头指针,比如 h1,h2,判断这俩个链表是否相交。
为了简化问题,我们假设俩个链表均不带环。
问题扩展:
1.如果链表可能有环列?
2.如果需要求出俩个链表相交的第一个节点列?

 

看到这个题目我很困惑。如果链表的结构是下面这个样子

typedef struct ListNode{    int m_Value;    ListNode * p_Next;}ListNode;

那么一旦有相交,链表的后端就都是一模一样的了啊?因为交叉点只可能有一个p_Next,那只要判断两个链表最后一个不为空的结点是否相同就可以了。

对有环列的,那环只能出现在链表最后面了。扩展的第1、2问只要对两个链表做两层循环判断就可以了。

但总觉得我理解的不对。对于带环链表的创建我也有点困惑。

/*第 7 题(链表)微软亚院之编程判断俩个链表是否相交给出俩个单向链表的头指针,比如 h1,h2,判断这俩个链表是否相交。为了简化问题,我们假设俩个链表均不带环。问题扩展:1.如果链表可能有环列?2.如果需要求出俩个链表相交的第一个节点列?start time = 11:10end time = */#include <stdio.h>#include <stdlib.h>typedef struct ListNode{    int m_Value;    ListNode * p_Next;}ListNode;void addNode(ListNode * &pHead, ListNode * newNode){    if(pHead == NULL)    {        pHead = (ListNode *)malloc(sizeof(ListNode));        pHead->m_Value = http://www.mamicode.com/newNode->m_Value;        pHead->p_Next = newNode->p_Next;    }    else    {        ListNode * x = pHead;        while(x->p_Next != NULL)        {            x = x->p_Next;        }        x->p_Next = (ListNode *)malloc(sizeof(ListNode));        x->p_Next->m_Value = http://www.mamicode.com/newNode->m_Value;        x->p_Next->p_Next = newNode->p_Next;    }}bool isCross(ListNode * p1, ListNode * p2){    ListNode * x = p1;    ListNode * y = p2;    while(x != NULL)    {        while(y != NULL)        {            if(x == y)            {                return true;            }            y = y->p_Next;        }        x = x->p_Next;    }}int main(){    ListNode n1 , n2, n3, n4, n5, n6, n7, n8, n9;    n1.m_Value = 1; n1.p_Next = &n2;    n2.m_Value = 2; n2.p_Next = &n3;    n3.m_Value = 3; n3.p_Next = &n7;    n4.m_Value = 4; n4.p_Next = &n5;    n5.m_Value = 5; n5.p_Next = &n6;    n6.m_Value = 6; n6.p_Next = &n7;    n7.m_Value = 7; n7.p_Next = &n8;    n8.m_Value = 8; n8.p_Next = &n9;    n9.m_Value = 9; n9.p_Next = NULL;    bool flag = isCross(&n1, &n4);    return 0;}