【链表】编程判断两个链表是否相交

1、如何判断两个链表(无环)相交?

(1)判断第一个链表中的每个节点是否在第二个链表中,时间复杂度为O(length1*length2);

(2)对第一个链表中的节点地址进行哈希,然后对第二个链表中的地址进行检查;

(3)人为够环,将链表A的尾部节点指向链表B,再判断是否够环成功?从链表B的头节点往下遍历,若能回到B,则说明相交;

(4)判断两个链表的最后一个节点是否相同,如果相交,尾节点肯定为同一个节点;

2、如何判断两个链表(不知是否有环)相交?

先判断是否有环,判断是否有环,可以使用追逐的办法,设置两个指针,一个走一步,一个走两步,如果能相遇,则说明有环。

(1)两个都没有环,则回到问题1;

(2)一个有环,一个无环,不用判断了,肯定链表不相交;

(3)两个都有环:判断链表A中的碰撞点是否出现在链表B中,如果出现,则相交(相交时,环必定共有);

  1 #include <iostream>
  2 using namespace std;
  3 
  4 
  5 struct Node
  6 {
  7     int value;
  8     Node * next;
  9 };
 10 
 11 //判断是否有环,返回bool,如果有环,返回环里的节点
 12 bool isCircle(Node * head, Node *& circleNode, Node *& lastNode)
 13 {
 14     Node * fast = head->next;
 15     Node * slow = head;
 16     while(fast != slow && fast && slow)
 17     {
 18         if(fast->next != NULL)
 19         {
 20             fast = fast->next;
 21         }
 22 
 23         if(fast->next == NULL)
 24         {
 25             lastNode = fast;
 26         }
 27         if(slow->next == NULL)
 28         {
 29             lastNode = slow;
 30         }
 31         
 32         fast = fast->next;
 33         slow = slow->next;
 34     }
 35     //找相交点
 36     if(fast == slow && fast && slow)
 37     {
 38         circleNode = fast;
 39         return true;
 40     }
 41     else
 42     {
 43         return false;
 44 
 45     }
 46 }
 47 
 48 //检测
 49 bool detect(Node * head1, Node * head2)
 50 {
 51     Node * circleNode1;
 52     Node * circleNode2;
 53     Node * lastNode1;
 54     Node * lastNode2;
 55     
 56     bool isCircle1 = isCircle(head1,circleNode1, lastNode1);
 57     bool isCircle2 = isCircle(head2,circleNode2, lastNode2);
 58     
 59     //一个有环,一个无环
 60     if(isCircle1 != isCircle2)
 61     {
 62         return false;
 63     }
 64     //两个都无环,判断最后一个节点是否相等
 65     else if(!isCircle1 && !isCircle2)
 66     {
 67         return lastNode1 == lastNode2;
 68     }
 69     //两个都有环,判断环里的节点是否能到达另一个链表环里的节点
 70     else
 71     {
 72         Node * temp = circleNode1->next;
 73         while(temp != circleNode1)
 74         {
 75             if(temp == circleNode2)
 76             {
 77                 return true;
 78             }
 79             temp = temp->next;
 80         }
 81         return false;
 82     }
 83     
 84     return false;
 85 }
 86 
 87 int main(int argc, char* argv[])
 88 {
 89     Node * n1 = new Node();
 90     Node * n2 = new Node();
 91     Node * n3 = new Node();
 92     Node * n4 = new Node();
 93     
 94     n1->next = n2;
 95     n2->next = n3;
 96     n3->next = n4;
 97     n4->next = NULL;
 98     
 99     
100     Node * n5 = new Node();
101     Node * n6 = new Node();
102     Node * n7 = new Node();
103     Node * n8 = new Node();
104     
105     n5->next = n6;
106     n6->next = n7;
107     n7->next = n8;
108     n8->next = n5;
109     
110     if(detect(n1,n2))
111     {
112         printf("相交\n");
113     }
114     else
115     {
116         printf("不相交\n");
117     }
118     
119     return 0;
120 }

猜你喜欢

转载自www.cnblogs.com/ocpc/p/12815244.html