(复刷) 面试题02.07.链表相交

原题链接:面试题02.07.链表相交

思路:
求相交的起始结点,并不是值相交,而是结点相交,那么也就代表判断条件是指针指向的位置相等即可

A、B链表长度可能不一致,假设他们一定有相交的结点
那么需要做的 就是直接统一A和B链表的长度,然后一起从头遍历,指针指向的位置是否相同,相同则代表相交,返回相交的指针就可以
如果没有返回相交的指针,那就代表这两个链表没有相交的结点,返回NULL即可

全代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        //遍历headA链表和headB链表的长度
        ListNode* heada = headA;
        ListNode* headb = headB;
        //统计headA和headB的长度
        int lenA = 0;
        int lenB = 0;

        while(heada != NULL)
        {//统计headA长度
            heada = heada ->next;
            lenA++;
        }
        while(headb != NULL)
        {//统计headB长度
            headb = headb ->next;
            lenB++;
        }
        if(lenA < lenB)
        {//交换, 让链表A成为最长的链表
            swap(lenA,lenB);
            swap(headA,headB);
        }
        //求交点,是指针指向的位置相同 而不是值相同
        int len = lenA - lenB;
        //将指针重新指向新headA和headB
        heada = headA;
        headb = headB;

        while(len--)
        {//让lenA指针移动到和lenB一样开头的地方
            heada = heada ->next;
        }
        while(heada != NULL)
        {//开始判断相交点,如果不相交则一直更新位置
            if(heada == headb)
            {//相交返回相交的指针
                return heada;
            }
            heada = heada ->next;
            headb = headb ->next;
        }
        return NULL;
    }
};

你可能感兴趣的:(链表,数据结构)