如何判断两个单向链表是否有相交,并找出交点

转载 2016年06月01日 23:26:21

http://blog.chinaunix.net/uid-20754793-id-177773.html

判断两个链表是否相交:(假设两个链表都没有环)
1、判断第一个链表的每个节点是否在第二个链表中
2、把第二个链表连接到第一个后面,判断得到的链表是否有环,有环则相交
3、先遍历第一个链表,记住最后一个节点,再遍历第二个链表,得到最后一个节点时和第一个链表的最后一个节点做比较,如果相同,则相交

如何判断一个单链表是有环的?(注意不能用标志位,最多只能用两个额外指针)
一种O(n)的办法就是(用两个指针,一个每次递增一步,一个每次递增两步,如果有环的话两者必然重合,反之亦然):
bool check(const node* head)
{
    if(head==NULL) return false;
    node *low=head, *fast=head->next;
    while(fast!=NULL && fast->next!=NULL)
    {
        low=low->next;
        fast=fast->next->next;
        if(low==fast) return true;
    }
    return false;
}

扩展问题参考:http://hi.baidu.com/azuryy/blog/item/18e85b02ec34a4094bfb51de.html
扩展1:如果链表可能有环,则如何判断两个链表是否相交
思路:链表1 步长为1, 链表2步长为2 ,如果有环且相交则肯定相遇,否则不相交

list1 head: p1
list2 head: p2
while( p1 != p2 && p1 != NULL && p2 != NULL )
{

      p1 = p1->next;
      if ( p2->next )
         p2 = p2->next->next;
      else
         p2 = p2->next;
}
if ( p1 == p2 && p1 && p2) //相交
else //不相交

扩展2:求两个链表相交的第一个节点
思路:在判断是否相交的过程中要分别遍历两个链表,同时记录下各自长度。

Node* step( Node* p, Node* q)
{
    if ( !p || !q ) return NULL;
    int pLen = 1;
    int qLen = 1;
    bool result = false;
    while( p->next )
    {
        pLen++, p = p->next;
    }
    while( q->next )
    {
        qLen++, q = q->next;
    }
    result = ( p == q );
    if ( result )
    {
        int steps = abs( pLen - qLen);
        Node* head = pLen > qLen ? p : q;
        while ( steps ) //对齐处理
        {
                head = head->next, steps--;
        }
        pLen > qLen ? p = head : q = head;
        while ( p != q )
        {
                p = p->next, q = q->next;
        }
        reutrn p;
    }
    return NULL;
}
下面转载来源:
http://blog.chinaunix.net/u2/63031/showart_1003241.html

深信服一道笔试:如何判断两个单向链表是否有相交,并找出交点。

题比较简单,单向链表有交点意思就是交点后的节点都是一样的了。

NODE* FindNode(NODE* pHead1, NODE* pHead2)
{
    NODE* p1 = pHead1;
    NODE* p2 = pHead2;
    int i = 1, j = 1, k = 0, f = 0;

    if(pHead2 == NULL || pHead2 == NULL)
    {
        return NULL;
    }

    while(p1->next != NULL)
    {
        p1 = p1->next;
        i++;
    }

    while(p2->next != NULL)
    {
        p2 = p2->next;
        j++;
    }

    if(p1 != p2)
    {
        return NULL;
    }
    else
    {
        p1 = pHead1;                // 1
        p2 = pHead2;

        f = fabs(i, j);
        if(> j)                    // 2
        {
            for(k=0; k<f; k++)
            {
                p1 = p1->next;
            }
            while(p1 != p2)
            {
                p1 = p1->next;
                p2 = p2->next;
            }
            return p1;
        }
        else
        {
            for(k=0; k<f; k++)
            {
                p2 = p2->next;
            }
            while(p1 != p2)
            {
                p1 = p1->next;
                p2 = p2->next;
            }
            return p1;
        }
    }
}

1,在第一次遍历完链表后,进行第二次遍历,需要把指针再次初始化;看见网上一些人给的例子没有再次初始化显然是错误的;再调用NULL的next不死才怪!

2,小优化。循环和判断,把判断放在外面;如果把i和j大小判断放在里面的话就意味着循环多少次,判断就执行多少次;当然这样做的唯一不足就是代码 多了点;还有for循环之前的对f的赋值,有的为了简便直接放在for语句里面,不过同样道理,放在for循环里面,就执行了n次的fabs;拿出来赋 值,只赋值一次就OK。

友情提示:养成写高效代码的习惯,不能图简便,觉得代码越少就越牛!


判断两个链表是否相交并找出交点

问题描述: 一个比较经典的问题,判断两个链表是否相交,如果相交找出他们的交点。 思路: 1、碰到这个问题,第一印象是采用hash来判断,将两个链表的节点进行hash,然后判断出节点,这种想法...
  • jiary5201314
  • jiary5201314
  • 2016年03月27日 10:01
  • 6796

判断两个链表是否相交并找出交点

问题描述: 一个比较经典的问题,判断两个链表是否相交,如果相交找出他们的交点。 思路: 1、碰到这个问题,第一印象是采用hash来判断,将两个链表的节点进行hash,然后判断出节点,这种想...
  • jiqiren007
  • jiqiren007
  • 2011年06月28日 14:55
  • 27611

两个单链表相交问题

两个单链表相交,树中两个节点最近公共祖先
  • Li_Ning_
  • Li_Ning_
  • 2016年06月16日 18:51
  • 1234

编程之美----链表相交问题

1 判断两个链表是否相交(假设两个链表均不带环) 有四种方法: 解法1:直观的想法 判断第一个链表的每个节点是否在第二个链表中,这种方法的时间复杂度为O(length(h1)*length(...
  • zyq0335
  • zyq0335
  • 2012年05月10日 10:39
  • 4806

判断两个单链表是否相交

首先要搞清楚单链表相交的概念和特点:指的是他们存在完全重合的部分,不是交叉到一个点(不存在这种情况,可以想想为什么),判断其是否相交的方法有以下几种。 (1)最传统方法 双重循环,依次查找...
  • G_BrightBoy
  • G_BrightBoy
  • 2011年09月27日 09:31
  • 3795

【面试题】-判断两个单链表是否相交并求出相交的第一结点

问题描述判断两个单链表是否相交,如果相交,给出相交的第一个点(假设两个链表都不存在环)。相交的链表示意图如下所示。 解题思路方法一两个没有环的链表如果是相交于某一结点,如上图所示,这个结点后面都是共...
  • zwhlxl
  • zwhlxl
  • 2015年05月15日 15:53
  • 1446

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

问题: 给出两个单向链表的头指针,而两个链表都可能带环,判断这两个链表是否相交,并且给出他们相交的第一个节点。 解法:参考http://blog.csdn.net/ldong2007/ar...
  • linyunzju
  • linyunzju
  • 2012年07月17日 00:46
  • 9486

如何判断两个链表是否相交并求出相交点

排除链表存在环的情况此情况的意思就是普通的单链表是否相交问题。 相交是什么意思?注意不是单纯的节点的数值域相等,相交的意思是两个链表的部门节点的是同一个,就是这些节点为这两个链表共有。 链表的...
  • dawn_after_dark
  • dawn_after_dark
  • 2017年06月28日 22:21
  • 1236

如何判断两个链表相交及找到第一个相交点

http://www.cnblogs.com/BeyondAnyTime/archive/2012/07/06/2580026.html  我们学一个算法,一定是为了用吧,所谓“学以致用”吗?那...
  • chengfangang
  • chengfangang
  • 2013年05月10日 17:27
  • 825

两个相交的单向链表求交点

点:边界细心处理,栈运用 题意:两个链表相交,求交点 剑指offer面试题37 思路:首先也说一下如何判断两个链表是否相交这是个普通常见题:看他们的尾节点是不是一个。     ...
  • u010246947
  • u010246947
  • 2017年08月18日 15:27
  • 127
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何判断两个单向链表是否有相交,并找出交点
举报原因:
原因补充:

(最多只允许输入30个字)