OJ练习32——T160 Intersection of Two Linked Lists

找两个链表的交叉节点,像这样:

A:            a1 → a2
                           ↘
                        c1 → c2 → c3
                       ↗            
B:     b1 → b2 → b3

没有交叉返回null;

第一个相同的节点就是交叉开始的地方(经验证,该题系统是这样,见后)

【思路】

1.从后向前遍历,遇到第一个不相同的就停止,但是链表不支持逆序,drop。

2.从哪个节点开始比较呢?先遍历一次,得到两个链表的长度,长度差为0的地方开始比。

【my code】

ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
    ListNode *a,*b,*re;
    a=headA;
    b=headB;
    int la=0,lb=0;
    while(a!=NULL){
        a=a->next;
        la++;
    }
    while(b!=NULL){
        b=b->next;
        lb++;
    }
    a=headA;
    b=headB;
    while(lb>la){
        b=b->next;
        lb--;
    }
    while(la>lb){
        a=a->next;
        la--;
    }
    while(a!=NULL&&b!=NULL){
        if(a->val!=b->val){
            a=a->next;
            b=b->next;
            continue;
        }
        else{
            re=a;
            while(a!=NULL&&b!=NULL&&a->val==b->val){//here
                a=a->next;
                b=b->next;
            }
            if(a==NULL&&b==NULL)
                return re;
            else
                continue;
        }
    }
    return NULL;
}

【评价】

用时120ms,都不在cpp的时间范围里了!

找了找原因,原来是我用了双层while,看了别人的答案不需要第二层,遇到的第一个相同的节点就是所求。

去掉该while后,用时75ms,比较正常。

原文地址:https://www.cnblogs.com/ketchups-notes/p/4460548.html