【从零单排之微软面试100题系列】07之判断两个链表是否相交

原创 2015年07月06日 22:24:11
本题目选自July大神博客系列【微软面试100题】:july大神,该系列我主要用来记录我的学习笔记。

题目描述:给出两个单向链表的头指针,判断两个链表是否相交。

 

分析思路:

如果只要判断是否相交,那么将每个链表遍历到表尾,看两个链表的表尾是不是同一个结点。因为相交的链表,最后一个结点肯定是公共的。

bool is_jointed1(Node* h1, Node* h2)
{
   if(h1 == NULL || h2 == NULL)
        return false;
    while(h1->next != NULL)
        h1 = h1->next;
     while(h2->next != NULL)
        h2 = h2->next;

     return h1 == h2;
}

此题比较简单,可再进行如下扩展:

(1)如果两个链表可能存在环,如何判断?

(2)(《剑指offer》面试题37)如何求两个链表的第一个公共结点。

对于(1),可以先判断每个链表是否存在环,分三种情况:1.都不存在环;2.只有一个存在环;3.两个都存在环。

都不存在环的情况上面已经讨论,只有一个链表存在环,说明肯定不会相交。接下来处理两个都存在环的情况。

判断存在环的代码:

Node* is_a_loop(Node* pHead)
{
    if(pHead == NULL || pHead->next ==NULL)
       return NULL;
    //定义一个快指针和慢指针,如果慢指针能够追上快指针,则存在环
    Node* p1 = pHead;
    Node* p2 = pHead->next;
    while(p2 != NULL && p2->next != NULL)
    {
       p1 = p1->next;          //一次走1步
       p2 = p2->next->next;    //一次走2步
       if( p1 == p2)
         return p1;            //返回的是环中的一个结点
    }
    return NULL;
}
假设两个链表都存在环:

bool is_jointed2(Node* h1, Node* h2)
{
    //保存两个链表中环的中的某个结点
    node* cyclic1 = is_a_loop(h1);
    node* cyclic2 = is_a_loop(h2);
    Node* p = cyclic1;
    while(1)
    {
       //在第一个环中绕一圈,看是否存在与cylic2相等的结点
       if(p == cylic2) return ture;
       //p = p->next->next;      <pre name="code" class="cpp">       p = p->next
//cylic1 = cylic1->next;
if(p == cylic1) return false;
 }
}


对于(2),可以根据书上的思路:首先分别遍历两个链表,得到链表的长度n1和n2。然后在长链表上先走|n1-n2|步,再同时在两个链表上遍历,找到第一个相同的结点。

//获取链表的长度
unsigned int GetListLength(Node* pHead)
{
     unsigned int nLength = 0;
     Node* pNode = pHead;
     while(pNode != NULL)
     {
          pNode = pNode->next;
          ++nLength; 
     }
     return nLength;
}

//找第一个公共结点

Node* FindFirstCommonNode(Node* pHead1, Node* pHead2)
{
     unsigned int nLen1 = GetListLength(pHead1);<pre name="code" class="cpp">     unsigned int nLen2 = GetListLength(pHead2);
     int nLenDif = nLen1 - nLen2;
    
     Node* pLong = pHead1;
     Node* pShort = pHead2;
     if(nLenDif < 0)
     {
          pLong = pHead2;
          pShort = pHead1;
          nLenDif = nLen2 - nLen1;
     }
     
     for(int i = 0; i < nLenDif; ++i)
          pLong = pLong->next;
     while(pLong != NULL && pShort != NULL && pLong != pShort)
     {
          pLong = pLong->next;
          pShort = pShort->next;
     }
    
     return pLong;
}





7 微软亚院之编程判断俩个链表是否相交,相交的首节点

/* 第 7 题 微软亚院之编程判断俩个链表是否相交 给出俩个单向链表的头指针,比如 h1,h2,判断这俩个链表是否相交。 为了简化问题,我们假设俩个链表均不带环。 问题扩展: 1.如果链表可能有环...
  • u012605629
  • u012605629
  • 2014年09月10日 21:00
  • 630

第7题 微软亚院之编程判断俩个链表是否相交 给出俩个单向链表的头指针,比如h1,h2,判断这俩个链表是否相交,并找出第一个相交结点。

思路 1.判断两链表是否相交 可以用两个指针,p1End, p2End,分别指向链表h1, h2的最后一个结点。如果p1End = p2End说明两链表相交。 2.找出相交的第一个结点 可以先...
  • FelixTT
  • FelixTT
  • 2012年11月07日 15:30
  • 829

7、微软亚院之编程判断俩个链表是否相交

题目: 给出俩个单向链表的头指针,比如h1,h2,判断这俩个链表是否相交。 为了简化问题,我们假设俩个链表均不带环。 问题扩展: 1.如果链表可能有环列? 2.如果需要求出俩个链表相交的第一...
  • zwb8848happy
  • zwb8848happy
  • 2012年03月04日 20:55
  • 2812

7.微软亚院之编程判断俩个链表是否相交(链表)

今天看了July的一篇经典文章《程序员编程艺术:第九章、闲话链表追赶问题》,因为现在一直复习数据结构有关链表的算法,顺便总结下,学习下July大牛的判断链表是否相交。出处:http://blog.cs...
  • macalyou
  • macalyou
  • 2012年10月12日 16:19
  • 696

给出两个单向链表的头指针,比如h1、h2, 判断链表是否相交

题目: 给出两个单向链表的头指针,比如h1、h2, 判断链表是否相交,如果不相交返回NULL;如果相交,返回指向第一个相交节点的指针; 时间复杂度控制在O(n)的前提下。   这道题首先要弄...
  • yongche_shi
  • yongche_shi
  • 2016年05月27日 16:30
  • 1086

<仅是自己做笔记。。。系列-6>判断俩个链表是否相交 给出俩个单向链表的头指针,比如h1,h2,判断这俩个链表是否相交。

判断俩个链表是否相交,给出俩个单向链表的头指针,比如h1,h2,判断这俩个链表是否相交。 总结了很多前辈的思想,在此做个小结 1. 先判断带不带环. 2. 如果都不带环,就判断尾节点...
  • qq_32444225
  • qq_32444225
  • 2015年11月03日 21:59
  • 478

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

问题: 给出两个链表的头指针,判断这两个链表是否相交。假设两个链表均不带环。 分析与解法:【解法一】 如果两个链表都无环,则可以把第二个链表接在第一个链表后面,如果得到的链表有环,则说明这两个链...
  • zengzhen_CSDN
  • zengzhen_CSDN
  • 2015年11月10日 16:41
  • 897

微软面试100题系列---判断两个链表是否相交

题目给出2个单向链表h1和h2,判断这两个链表是否相交; 假设2个链表都不带环。实现思路:如果两个链表相交,则他们一定有着相同的尾节点,所以分别求出2个链表的尾节点,判断尾节点是否相同;代码实现:b...
  • bh_xiaoxinba
  • bh_xiaoxinba
  • 2016年09月02日 12:11
  • 149

微软经典面试100题系列(部分)

本文整理自:http://blog.csdn.net/v_july_v/article/details/6543438     1. 把二元查找树转变成排序的双向链表     题目: 输入一棵二元查...
  • zhoudaxia
  • zhoudaxia
  • 2014年07月10日 14:29
  • 16812

Java代码 判断两个链表是否相交

题目:判断两个单向链表是否相交,假设两个链表均不存在环 算法思路:有两种方法,第一种方法就是在其中一个链表上顺序遍历每个节点,每遍历一个节点的时候,在另外一个链表上顺序遍历每个节点,如果便利过程中发...
  • yangmm2048
  • yangmm2048
  • 2015年04月07日 19:55
  • 1356
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【从零单排之微软面试100题系列】07之判断两个链表是否相交
举报原因:
原因补充:

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