zoukankan      html  css  js  c++  java
  • 查找两个链表的共同子链表

    注:基于jeanphorn‘s csdn文章进行修改而成。

    1. 问题描述

      给定两个单链表,查找这两个单链表的交叉节点。例如:链表listA为:a1a2c1c2c3,链表listB为:b1b2b3c1c2c3。那么这两个的第一个交叉节点为c1

    2. 方法与思路

      首先,观察一下交叉节点的特点。如果两个链表有交叉节点的话,那么这个交叉节点之后的其他节点都是相同的,也就是说两个链表的结构应该是Y字型的。

    也就是说,c1之后的节点都是交叉节点。下面的问题就是如何确定c1这个节点,我们可以设两个指针分别遍历两个链表,然后对比节点的值,但是两个链表可能是不等长的,我们可以先让长度较大的链表指针先走|len(listA)len(listB)|步,然后在同步进行。 
          时间复杂度O(n+m+n)(注:n为较长的链表的长度,m为较短的链表的长度),空间复杂度O(1)

    c++代码如下:

     1     //求出链表长度
     2     int getListLength(ListNode *head)
     3     {
     4         int len = 0;
     5         ListNode *tmp = head;
     6         while(tmp){
     7            tmp = tmp->next;
     8            len++;
     9         }
    10         return len;
    11     }
    12     //判断交叉节点
    13     ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
    14         ListNode *a = headA, *b = headB;
    15 
    16         int ab  = getListLength(a)-getListLength(b);
    17 
    18         if(ab > 0)
    19         {
    20             while(ab) a = a->next, ab--;
    21         }
    22         else if(ab < 0)
    23         {
    24             while(ab) b = b->next, ab++;
    25         }
    26 
    27         while(a && b)
    28         {
    29             if(a->val == b->val) return a;
    30 
    31             a = a->next;
    32             b = b->next;
    33         }
    34 
    35         return NULL;
    36     }

     

  • 相关阅读:
    sql
    Java后台通过传参得到对应的坐标值的方法
    运行第一个大型项目工程时出现的问题
    对sqlserver存储过程合游标循环中的一点心得
    (基于Java)算法之动态规划——矩阵连乘问题
    算法之线性时间选择(最坏情况下)
    算法之快速排序
    算法之合并排序
    算法之二分搜索法
    设计模式之装饰者模式
  • 原文地址:https://www.cnblogs.com/KnowledgeSky/p/6581338.html
Copyright © 2011-2022 走看看