码迷,mamicode.com
首页 > 其他好文 > 详细

查找两个链表的交叉节点

时间:2015-08-04 11:25:08      阅读:99      评论:0      收藏:0      [点我收藏+]

标签:单链表   交叉节点   

1. 问题描述

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


2. 方法与思路

  首先,观察一下交叉节点的特点。如果两个链表有交叉节点的话,那么这个交叉节点之后的其他节点都是相同的,也就是说两个链表的结构应该是Y字型的。
  技术分享
  
  也就是说,c1之后的节点都是交叉节点。下面的问题就是如何确定c1这个节点,我们可以设两个指针分别遍历两个链表,然后对比节点的值,但是两个链表可能是不等长的,我们可以先让长度较大的链表指针先走|len(listA)?len(listB)|步,然后在同步进行。
  时间复杂度O(n),空间复杂度O(1)
  c++代码如下:
  

    //求出链表长度
    int getListLength(ListNode *head)
    {
        int len = 0;
        ListNode *tmp = head;
        while(tmp) tmp = tmp->next,len++;

        return len;
    }
    //判断交叉节点
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        ListNode *a = headA, *b = headB;

        int ab  = getListLength(a)-getListLength(b);

        if(ab > 0)
        {
            while(ab) a = a->next, ab--;
        }
        else if(ab < 0)
        {
            while(ab) b = b->next, ab++;
        }

        while(a && b)
        {
            if(a->val == b->val) return a;

            a = a->next;
            b = b->next;
        }

        return NULL;
    }

版权声明:本文为博主原创文章,未经博主允许不得转载。

查找两个链表的交叉节点

标签:单链表   交叉节点   

原文地址:http://blog.csdn.net/jeanphorn/article/details/47272119

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!