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 }
  • 相关阅读:
    hive表增量抽取到oracle数据库的通用程序(二)
    java进程的守护进程脚本
    hadoop2.7节点的动态增加与删除
    hive表增量抽取到oracle数据库的通用程序(一)
    arduino 驱动电调
    arduino IO口
    通过电机编码器AB相输出确定电机转向
    Wifi小车资料
    winform 按键控制
    vs2010 EF4.0 访问mysql
  • 原文地址:https://www.cnblogs.com/MrListening/p/5512298.html
Copyright © 2011-2022 走看看