zoukankan      html  css  js  c++  java
  • 常见链表面试题之判断链表是否相交,并求交点

       给定我们两个链表,在这里,我们先讨论单链表不带环的情况,我们该怎么判断它们是否相交?并求出其交点呢。

       首先我们来分析一下两个链表相交都有哪几种情况。第一种就是Y型,它们从某一个节点相交,第二种是V型,它们直到尾节点才相交。下面两幅图分别对应两种情况。

    1.Y型相交

               

    2. V型相交

               

    其实不难发现,如果两个链表相交的话,它们的尾节点肯定是相同的。所以如果要判断两个链表是否相交,我们可以遍历两个链表,看它们的尾节点是否相等,相等就能判定其相交。isCross函数,如果相交返回1,否则返回0.

     1 int isCross(PNode pHead1, PNode pHead2)
     2 {
     3     PNode pnode1 = pHead1;
     4     PNode pnode2 = pHead2;
     5     if (pHead1 != NULL && pHead2 != NULL)
     6     {
     7         while (pnode1->pnext != NULL)
     8         {
     9             pnode1 = pnode1->pnext;
    10         }
    11         while (pnode2->pnext != NULL)
    12         {
    13             pnode2 = pnode2->pnext;
    14         }
    15         if (pnode1 == pnode2)  //判断尾节点是否相等
    16         {
    17             return 1;
    18         }
    19     }
    20     return 0;
    21 }

    要求其交点的话(第一个交点),我们的思路应该很明显,就是找到其中第一个相等的节点,便是他们的第一个交点。

    但此时就要考虑怎么进行节点的比较了,因为有Y型和V型,我们不能直接从第一个节点进行遍历比较,所以应该再写一个length函数用来求链表的长度,然后让长的链表先走,当走到一样长的地方开始进行比较,找到相等的节点就返回这个节点。

    length函数:

     1 int length(PNode pHead)
     2 {
     3     PNode pnode = pHead;
     4     int len = 0;
     5     if (pHead == NULL)
     6     {
     7         return 0;
     8     }
     9     while (pnode)
    10     {
    11         len++;
    12         pnode = pnode->pnext;
    13     }
    14     return len;
    15 }

    GetCrossNode求交点函数:

     1 PNode GetCrossNode(PNode pHead1, PNode pHead2)
     2 {
     3     PNode pnode1 = pHead1;
     4     PNode pnode2 = pHead2;
     5     int len1 = length(pHead1);
     6     int len2 = length(pHead2);
     7     int step = len1 - len2;
     8     if (0 == isCross(pHead1, pHead2) || pHead1 == NULL || pHead2 == NULL)
     9     {
    10         return NULL;
    11     }
    12 
    13     if (step >= 0)
    14     {
    15         while (step--)
    16         {
    17             pnode1 = pnode1->pnext;
    18         }
    19         while (pnode1)
    20         {
    21             if (pnode1 == pnode2)
    22             {
    23                 return pnode1;
    24             }
    25             pnode1 = pnode1->pnext;
    26             pnode2 = pnode2->pnext;
    27         }
    28     }
    29     else
    30     {
    31         step = 0 - step;
    32         while (step--)
    33         {
    34             pnode2 = pnode2->pnext;
    35         }
    36         while (pnode2)
    37         {
    38             if (pnode1 == pnode2)
    39             {
    40                 return pnode1;
    41             }
    42             pnode1 = pnode1->pnext;
    43             pnode2 = pnode2->pnext;
    44         }
    45     }
    46     return NULL;
    47 }
  • 相关阅读:
    线性代数思维导图——3.向量
    微分中值定理的基础题型总结
    构造函数
    Python课程笔记(七)
    0241. Different Ways to Add Parentheses (M)
    0014. Longest Common Prefix (E)
    0013. Roman to Integer (E)
    0011. Container With Most Water (M)
    0010. Regular Expression Matching (H)
    0012. Integer to Roman (M)
  • 原文地址:https://www.cnblogs.com/MrListening/p/5512298.html
Copyright © 2011-2022 走看看