力扣11:链表相交

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。

如示例1所示,交点并不是1结点,而是8结点,相交结点是物理意义上的相交,也就是结点的地址相同,是同一个结点,而不是因为结点的值相等就是相交结点。

力扣11:链表相交_第1张图片

class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        ListNode* curA = headA;
        ListNode* curB = headB;
        int lenA = 0, lenB = 0;
        while (curA != NULL) { // 求链表A的长度
            lenA++;
            curA = curA->next;
        }
        while (curB != NULL) { // 求链表B的长度
            lenB++;
            curB = curB->next;
        }
        curA = headA;
        curB = headB;
        // 让curA为最长链表的头,lenA为其长度,这点处理的很巧妙,直接交换A B长度和指针变量的值
        if (lenB > lenA) {
            swap (lenA, lenB);
            swap (curA, curB);
        }
        // 求长度差
        int gap = lenA - lenB;
        // 让curA和curB在同一起点上(末尾位置对齐)
        while (gap--) {
            curA = curA->next;
        }
        // 遍历curA 和 curB,遇到相同则直接返回
        while (curA != NULL) {
            if (curA == curB) {
                return curA;
            }
            curA = curA->next;
            curB = curB->next;
        }
        return NULL;
    }
};

注意:在最后的while中,也可以直接用如下代码

while的循环条件就是当curA和curB指针不相等,并且curA指针不为空的时候,才能进入循环。因为循环的内容是AB指针同时往后移动一个结点,要想往下移动,需要同时满足两个条件:

①AB指针不相等(相等就return了,找的就是指针相等的结点)

②并且后面有位置可以使其移动。

   while(curA!=curB&&curA!=NULL) 
        {
            curA=curA->next;
            curB=curB->next;
        }
       return curA;

出自:代码随想录

你可能感兴趣的:(leetcode,链表,算法)