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; }