您的位置:首页 > 其它

查找两个链表的交叉节点

2015-08-04 09:37 459 查看

1. 问题描述

  给定两个单链表,查找这两个单链表的交叉节点。例如:链表listA为:a1→a2→c1→c2→c3a_1 \to a_2 \to c_1 \to c_2 \to c_3,链表listB为:b1→b2→b3→c1→c2→c3b_1 \to b_2 \to b_3 \to c_1 \to c_2 \to c_3。那么这两个的第一个交叉节点为c1c_1。

2. 方法与思路

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

  



  

  也就是说,c1c_1之后的节点都是交叉节点。下面的问题就是如何确定c1c_1这个节点,我们可以设两个指针分别遍历两个链表,然后对比节点的值,但是两个链表可能是不等长的,我们可以先让长度较大的链表指针先走|len(listA)−len(listB)||len(listA)-len(listB)|步,然后在同步进行。

  时间复杂度O(n)O(n),空间复杂度O(1)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;
    }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: