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

第 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:10
end 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 = 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 = 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;
}

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

时间: 2024-10-13 20:57:45

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

判断俩个链表是否相交

判断俩个链表是否相交给出俩个单向链表的头指针,比如h1,h2,判断这俩个链表是否相交.为了简化问题,我们假设俩个链表均不带环.问题扩展:1.如果链表可能有环列?2.如果需要求出俩个链表相交的第一个节点列?ANSWER:struct Node {  int data;  int Node *next;};// if there is no cycle.int isJoinedSimple(Node * h1, Node * h2) {  while (h1->next != NULL) {   

编程之美---判断两个链表是否相交

首先,判断一个链表是否有环? 对于这个问题:可以用两个指针,刚开始都指向头节点,然后一个指针每次向后移一步,另一个指针每次向后移两步,如果最后移两步的指针为空时,说明无环,如果最后两个指针相等,说明有环.如果把第一指针看成静止,则相当于第二个每次走一步,所以在那个环上时,是一定能相遇的. 如何找到这个链表环的入口? 当这两个指针相遇后,把第一个指针移向头,两个指针每次都只移一步,再次相等时,就是环的入口.证明:设环上相遇位置为距离环入口处P,入口处前有M个节点,,环肾功能有N个节点,从入口处开始

【编程题目】判断整数序列是不是二元查找树的后序遍历结果,如果是,构建该二元查找树

判断整数序列是不是二元查找树的后序遍历结果题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果.如果是返回 true,否则返回 false.例如输入 5.7.6.9.11.10.8,由于这一整数序列是如下树的后序遍历结果:8/ \6 10/ \ / \5 7 9 11因此返回 true.如果输入 7.4.6.5,没有哪棵树的后序遍历的结果是这个序列,因此返回 false. 做这个题目的时候最开始傻了,想着从前到后根据数字的大小关系判断.后来幡然醒悟,根据后序遍历的特点.序列最后一

数据结构和算法设计专题之---判断两个链表是否相交并找出交点

题目: 一个比较经典的问题,判断两个链表是否相交,如果相交找出他们的交点. 首先来看一下如何判断两个链表是否存在相交的节点: 思路: 1.碰到这个问题,第一印象是采用hash来判断,将两个链表的节点进行hash,然后判断出节点,这种想法当然是可以的. 2.当然采用暴力的方法也是可以的,遍历两个链表,在遍历的过程中进行比较,看节点是否相同. 3.第三种思路是比较奇特的,在编程之美上看到的.先遍历第一个链表到他的尾部,然后将尾部的next指针指向第二个链表(尾部指针的next本来指向的是null).

【IT公司100题-7】-判断两个链表是否相交

问题:有一个单链表,其中可能有一个环,也就是某个节点的next指向的是链表中在它之前的节点,这样在链表的尾部形成一环.1.如何判断一个链表是不是这类链表? 问题扩展:1.如果链表可能有环呢?2.如果需要求出两个链表相交的第一个节点呢? 分析: 在无环的情况下,如果两个链表有结点相同,那么它们下一结点也相同,如此可推出尾结点也相同. 那么只要判断两链表的尾结点是否相同.(O(len1+len2)) 1 struct Node { 2 int data; 3 int Node *next; 4 };

【编程题目】输入一个单向链表,输出该链表中倒数第 k 个结点

第 13 题(链表):题目:输入一个单向链表,输出该链表中倒数第 k 个结点.链表的倒数第 0 个结点为链表的尾指针.链表结点定义如下: struct ListNode {int m_nKey;ListNode* m_pNext;}; 我的思路:先翻转链表,再从翻转后的链表的头向尾数k-1个,返回,再次翻转链表. 代码如下:注意这个思路非常差.差的原因是:如果只是用最原始的方法,先遍历一遍计数,再遍历一遍找倒数第k个,需要遍历两遍.但我的思路,翻转两次链表就要遍历两遍.还要在走k-1步找倒数第k

判断两个链表是否相交

1 假设两个链表都没有环 解题思路 a. 直接循环判断第一个链表的每个节点是否在第二个链表中.但,这种方法的时间复杂度为O(Length(h1) * Length(h2)).显然,我们得找到一种更为有效的方法,至少不能是O(N^2)的复杂度. b. 针对第一个链表直接构造hash表,然后查询hash表,判断第二个链表的每个节点是否在hash表出现,如果所有的第二个链表的节点都能在hash表中找到,即说明第二个链表与第一个链表有相同的节点.时间复杂度为为线性:O(Length(h1) + Leng

数字之魅:判断两个链表是否相交

题目:给出两个链表的头指针,比如head1和head2,判断这两个链表是否相交.这里为了化简,我们假设两个链表均不带环. 方案一:蛮力法.一般我们都能想到的,就是从head1开始,逐个与head2中的每个结点的地址比较,看是否相等,如果不等,则head1移动到下一个结点,继续和head2中的每一个结点的地址比较:如果找到相等,则这两个链表相交:直到head1==NULL,则不相交.注意为了避免存在相同的元素,我们采取比较地址的方法,而不是比较元素,在判断链表里是否有环的时候,也是采用比较地址的方

判断两条链表是否相交(公共部分)并找出相交处

Problem: 两个单链表相交的一系列问题 [题目] 在本题中,单链表可能有环,也可能无环.给定两个 单链表的头节点 head1和head2,这两个链表可能相交,也可能 不相交.请实现一个函数, 如果两个链表相交,请返回相交的 第一个节点:如果不相交,返回null 即可. 要求: 如果链表1 的长度为N,链表2的长度为M,时间复杂度请达到 O(N + M),额外 空间复杂度请达到O(1) Solution: 对于判断单链表是否有环,则使用快慢指针即可知道,两指针相交,则有环 对于判断双链表是否