判断两条链表是否相交(公共部分)并找出相交处

Posted zzw1024

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了判断两条链表是否相交(公共部分)并找出相交处相关的知识,希望对你有一定的参考价值。


Problem:
  两个单链表相交的一系列问题
  【题目】 在本题中,单链表可能有环,也可能无环。给定两个
    单链表的头节点 head1和head2,这两个链表可能相交,也可能
    不相交。请实现一个函数, 如果两个链表相交,请返回相交的
    第一个节点;如果不相交,返回null 即可。
  要求:

    如果链表1 的长度为N,链表2的长度为M,时间复杂度请达到 O(N + M),额外
    空间复杂度请达到O(1)

Solution:
  对于判断单链表是否有环,则使用快慢指针即可知道,两指针相交,则有环
  对于判断双链表是否相交,则判断遍历链表的最后指针的地址是否相同,相同则有公共部分
  然后在从头遍历,长的链表先遍历长的部分,然后一起遍历,当指针相同时,则为相交的部位。

 

Code:

  

  1 #include <iostream>
  2 
  3 using namespace std;
  4 
  5 struct Node
  6 
  7     int val;
  8     Node* next;
  9     Node(int a = 0) :val(a), next(NULL) 
 10 ;
 11 
 12 void FindNode(Node* head1, Node* head2)
 13 
 14     if (head1->next == NULL || head2->next == NULL)
 15         return;
 16     Node *p1, *p2;
 17     p1 = head1->next;
 18     p2 = head2->next;
 19     int size1, size2;//计算链表长度
 20     size1 = size2 = 1;
 21     while (p1->next || p2->next)
 22     
 23         if (p1->next)
 24         
 25             p1 = p1->next;
 26             size1++;            
 27         
 28         if (p2->next)
 29         
 30             p2 = p2->next;
 31             size2++;
 32         
 33     
 34     if (p1 != p2)
 35     
 36         cout << "List1 and List2 have no commmon part!" << endl;
 37         return;
 38     
 39     cout << "List1 and List2 have commmon part!" << endl;
 40     //重新遍历,找到交点
 41     p1 = head1->next;
 42     p2 = head2->next;
 43     for (int i = 0; i<(size1>size2 ? size1 - size2 : size2 - size1); ++i)//长的先遍历
 44     
 45         if (size1 > size2)
 46             p1 = p1->next;
 47         else
 48             p2 = p2->next;
 49     
 50     while (p1 != p2)
 51     
 52         p1 = p1->next;
 53         p2 = p2->next;
 54     
 55     cout << "相交部位为:addr:" << p1 << "  val:" << p1->val << endl;
 56 
 57 
 58 
 59 void Test()
 60 
 61     int a[] =  1,2,3,4,5,6 ;
 62     int b[] =  4,5,6 ;
 63     int c[] =  7,8,9,10 ;
 64     Node* head1 = new Node(-1);
 65     Node* head2 = new Node(-1);
 66     Node* p1 = head1;
 67     Node* p2 = head2;
 68 
 69     for (auto n : a)
 70     
 71         Node* q = new Node(n);
 72         p1->next = q;
 73         p1 = q;
 74     
 75     p1->next = NULL;
 76     for (auto n : b)
 77     
 78         Node* q = new Node(n);
 79         p2->next = q;
 80         p2 = q;
 81     
 82     p2->next = NULL;
 83 
 84     cout << "相交之前判断:" << endl;
 85     FindNode(head1, head2);
 86     cout << "***********************" << endl;
 87     for (auto n : c)
 88     
 89         Node* q = new Node(n);
 90         p1->next = q;
 91         p1 = q;
 92         p2->next = q;
 93         p2 = q;
 94     
 95     p1->next = NULL;
 96     p2->next = NULL;
 97 
 98     cout << "相交之后判断:" << endl;
 99     FindNode(head1, head2);
100     cout << "***********************" << endl;
101 

 

以上是关于判断两条链表是否相交(公共部分)并找出相交处的主要内容,如果未能解决你的问题,请参考以下文章

1.11判断两个无环单链表是否相交

判断2个线段是否相交

c/c++单链表面试题—链表相交问题

leetcode链表算法题实现思路

1264 线段相交

1264 线段相交