力扣-相交链表中的困惑

https://leetcode.cn/problems/intersection-of-two-linked-lists/description/
likou写题的时候发现有个地方我不明白,
为什么这样写while循环里面的不对呀,给我报错,时间超时,我不太清楚
我理解的A指针检测下一个指向空形成循环链表,但是答案是检测当前指针指向空再形成循环链表,我想这不是一样吗?
以及这种情况咋结出来的,两个不相交的情况下,不会陷入死循环吗?
求解

while(A!=B) {
        if(A->next==NULL) {
            A->next=headB;
        } 
        if(B->next==NULL) {
            B->next=headA;
        }
        A=A->next;
        B=B->next;
    }

下面是对的代码


struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
    //特殊情况优先考虑
    if(headA==NULL || headB==NULL) {
        return NULL;
    }

    struct ListNode* A=headA;
    struct ListNode* B=headB;
    while(A!=B) {
        if(A==NULL) {
            A=headB;
        } else{
            A=A->next;
        }
        if(B==NULL) {
            B=headA;
        } else {
            B=B->next;
        }
    }
    return A;
}

上面第一种写法,实际地把 headA headB 链表形成了循环链表,即: A->next=headB; B->next=headA; 这两句,也就是实际地把两个链表尾指针都指向了另一个链表的头,改变了链表最尾指针next 的指向。
第二种写法,是用指针变量 A B 分别指向两个链表,当指针指向一个链表尾部时,再让指针重新指向另一个链表头,没有改变链表。两个不相交的情况,当循环到出现 A = NULL B = NULL , while (A != B) 条件就不满足了,就退出while()循环了。