9.判断两个单链表是否相交

9.判断两个单链表是否相交

注意这里是判断是否相交。对于判断问题来讲,相对还是比较简单的。注意单链表并非不能有重复元素。

思路1:O(len1*len2)

把第一个链表的指针值逐项存在hashtable中,遍历第2个链表的每一项的指针值,如果能在第一个链表中找到,则必然相交。但是C++的STL模板中的hash不太会用。所以我使用了set集合,不过貌似set集合是使用遍历的方式来查找元素是否在集合中的,所以效率是比较低的,至少在O(len1*len2)级别。

bool judgeIntersectList1(Node* Head1,Node* Head2)

//判断两个单链表是否相交(Y型)
bool  judgeIntersectList1(Node* Head1,Node* Head2)
{
     set<Node*>s;
     Node* p1=Head1;
     Node* p2=Head2;
     while(p1!=NULL)
     {
          s.insert(p1);
          p1=p1->next;
     }
     while(p2!=NULL)
     {
          if(s.find(p2)!=s.end())
          {
               s.clear();
               return true;
          }
          p2=p2->next;
     }
     s.clear();
     return false;
}

  

思路2:O(len1+len2)

把一个链表A接在另一个链表B的末尾,如果有环,则必然相交。如何判断有环呢?从A开始遍历,如果能回到A的表头,则肯定有环。

注意,在返回结果之前,要把刚才连接上的两个链表断开,恢复原状。

bool judgeIntersectList2(Node* Head1,Node* Head2)

//判断两个单链表是否相交(Y型)
bool  judgeIntersectList2(Node* Head1,Node* Head2)
{
     if(Head1==NULL||Head2==NULL)
     {
          return false;
     }
     Node* p1=Head1;
     Node* p2=Head2;
     while(p2->next!=NULL)    //先找到链表2的末尾,由p2指向
     {
          p2=p2->next;
     }
     p2->next=p1;        //将链表1的表头与链表2的表尾连接

     while(p1!=NULL)     //遍历链表1,如果回到了链表1表头,则相交
     {
          if(p1->next==Head1)
          {
               p2->next=NULL;    //恢复原状
               return true;
          }
          p1=p1->next;
     }
     p2->next=NULL;    //恢复原状
     return false;
}

  

思路3:O(len1+len2)

如果两个链表的末尾元素相同(指针相同,即为同一个元素,而非值相等),则必相交。
bool judgeIntersectList3(Node* Head1,Node* Head2)

//判断两个单链表是否相交(Y型)
bool  judgeIntersectList3(Node* Head1,Node* Head2)
{
     if(Head1==NULL || Head2==NULL)
     {
          return false;
     }
     Node* p1=Head1;
     Node* p2=Head2;
     while(p1->next!=NULL)    //p1与p2记录两链表的尾指针
          p1=p1->next;
     while(p2->next!=NULL)
          p2=p2->next;
     if(p1==p2)
     {
          return true;
     }
     return false;
}

  

时间: 2024-10-10 22:18:18

9.判断两个单链表是否相交的相关文章

7_2判断两个单链表是否相交,若相交,求出第一个交点

转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4251372.html 声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己也方便有类似问题的朋友,本文的思想也许有所借鉴,但源码均为本人实现,如有侵权,请发邮件表明文章和原出处地址,我一定在文章中注明.谢谢. 题目:7_2判断两个单链表是否相交,若相交,求出第一个交点. 题目分析: 创建A,B两个单链表,将B的尾部指向头部,若两个单链表相交,则交点必为环的入口,这就又变成

判断两个单链表是否相交及相交的第一个节点

/* 问题: 1.判断两个单链表是否相交 2.找出第一个相交节点 解题思路: 1.若连个链表相交则从相交节点开始以后节点都是一样的 2.通过链表长度判断然后去寻找 */ #include<stdlib.h> #include<stdio.h> /* 创建节点 */ typedef struct STU { char a; struct STU *next; }*SListNode; SListNode ListA; SListNode ListB; /* 创建链表A */ SLis

判断两个单链表是否相交

题目描述: 给定两个单链表的头节点head1和head2,如何判断两个链表是否相交?相交的话返回true,不想交的话返回false. 给定两个链表的头结点head1和head2.请返回一个bool值代表它们是否相交. 链表中节点的类型设置如下: class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } } 思路: 1.首先判断是否有环, 若两个链表都没有环,则进行无环单链表判断是否相

java判断两个单链表是否相交

转载于:http://blog.csdn.net/happymatilian/article/details/47811161 思路: 链表分有环链表和无环链表,如果两个链表存在相交,则只有两种可能,两个链表都无环或者都有环. (1)如果链表都无环,则先判断链表的尾指针是否一样,如果不一样,则没有相交.如果一样,则找出两个链表的长度差,将两个链表从距离尾节点同样的距离进行扫描,如果相交,则必然有一处扫描节点相同.实例数据List1:1->2->3->4->5->6->7

判断两个单链表是否相交?若相交求交点

思想: 如果它们相交,则最后一个节点一定是共有的. ListNode* IsIntersect(ListNode * list1, ListNode* list2 ) {                  assert(list1 && list2);                  ListNode* l1 = list1 ;                  ListNode* l2 = list2 ;                  int cout1 = 0;         

Intersection of Two Linked Lists (判断两个单链表是否相交)

题目描述: Write a program to find the node at which the intersection of two singly linked lists begins. For example, the following two linked lists: A: a1 → a2 c1 → c2 → c3 B: b1 → b2 → b3 begin to intersect at node c1. Notes: If the two linked lists hav

判断2个单链表是否相交,并求出第一个相交结点

不考虑单链表有环的情况下 如果2个单链表相交,一定是Y型链表 1.遍历2个链表到尾结点,记录2个链表的长度x,y 2.尾结点相同,则相交. 3.从表头开始,长链表先走|x-y|步,之后2个链表一起走,判断第一个相同的点. 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 typedef struct student //定义链表结构 5 { 6 int num; 7 struct stu

判断两个单向链表是否相交

分为三种情况:第一种情况: 一个链表有环,一个链表没有环,那这两个链表不可能相交第二种情况: 两个链表都没有环第三种情况: 两个链表都有环 public class FindFirstIntersectNode { public static class Node { public int value; public Node next; public Node(int data) { this.value = data; } } /** * 分为三种情况: * 第一种情况: 一个链表有环,一个

如果判断两个单链表有交?第一个交点在哪里?

检测单链表是否有环 参考:判断单链表里面有没有环