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

1.问题描述

给出两个单向链表的头指针,比如h1、h2,判断两个链表是否相交。编程之美为了简化问题,假设两个链表均不带环。

如下图:

 

 

2.分析与解法

解法一:直观法,先判断第一个链表的每个节点是否在第二个链表中,这种方法时间复杂度为O(Length(h1)*Length(h2))

 

解法二:hash表计数法,首先将第一个链表的所有节点地址进行hash排序,建立hash表,然后针对第二个链表的每个节点的地址,查询hash表,如果它在hash表中存在,那么说明两个链表有交点。这个方法时间复杂度O(Length(h1)+Length(h2)),空间复杂度O(Length(h1))。

 

解法三:转换为是否有环问题,可以将第一个链表的的结尾接到第二个链表表头,然后遍历第二个链表,测试其是否有关,若有环,则表示两个链表相交。方法时间复杂度O(Length(h1)+Length(h2))

 

解法四:先遍历第一个链表,遍历到最后一个节点,然后遍历第二个链表,到最后一个接节点,然后对比两个最后一个节点,相同则相交,不相同,则不相交。方法时间复杂度O(Length(h1)+Length(h2))。代码如下:

struct node
{
       int data;
       node *next;
};

int isCross(node *h1, node *h2)
{
    node *p, *q;
    
    for(p = h1; p->next!=NULL; p++);    
    for(q = h2; q->next!=NULL; q++);
    
    return p == q ? 1 : 0; 
}

 

 

 

 

 

posted on 2012-08-17 14:54  as_  阅读(2820)  评论(0编辑  收藏  举报

导航