zoukankan      html  css  js  c++  java
  • 判断两条链表是否相交(公共部分)并找出相交处


    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 }
  • 相关阅读:
    bit byte哪些事
    各种字符集和编码详解
    常用工具大全
    表单提交的3种方式,http post的contentType
    主动发电
    Hibernate与 MyBatis的比较
    storm简介
    2013年十大免费云空间排行榜-给开发者建站用的免费云主机
    中国著名讲师全录
    iptables只允许指定ip地址访问指定端口
  • 原文地址:https://www.cnblogs.com/zzw1024/p/10989469.html
Copyright © 2011-2022 走看看