剑指 Offer 52. 两个链表的第一个公共节点

运行超时怎么办啊,代码时间复杂度也不高啊,有无人看还有哪里能改进时间的地方
代码如下:


```c
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {

    
        struct ListNode* tailA = headA;
        struct ListNode* tailB = headB;
        int a=0,b=0; //记录两个链表的长度

        while(tailA){ //分别遍历两个链表,记录长度
            tailA++;
            a++;
        }
         while(tailB){
            tailB++;
            b++;
        }

    if(tailB != tailA){ //两个尾指针不一致,必然不相交
         return NULL;
    }

 //相交求交点
        tailA = headA; //链表指针归位
        tailB = headB;


        int c=0; //c等于两链表长度差
        if (a<b){
          c=b-a;
          tailB+=c;//链表对齐
        }
        else{
          c=a-b;
          tailA+=c;//链表对齐
        }

        while(tailA!=tailB)
        {
            tailB++;
            tailA++;
        }
        return tailA;
           
 
}

```

超时是因为死循环了,用指针++的方式遍历链表就离谱,你while(指针)永远为真,因为指针会一直自增。把所有指针++替换成指针=指针->next就好了。记得return前的循环加上判断指针为NULL

供参考:

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB)
{
      struct ListNode* pa = headA, *pb = headB;
      while(pa != pb) {
               pa = (pa == NULL) ? headB : pa = pa->next;
               pb = (pb == NULL) ? headA : pb = pb->next;
      }
      return pa;
}