leetcode-160-intersection of two linked lists

Problem Description:

Write a program to find the node at which the intersection of two singly linked lists begins.

For example, the following two linked lists:

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

begin to intersect at node c1.

Notes:

If the two linked lists have no intersection at all, return null.
The linked lists must retain their original structure after the function returns.
You may assume there are no cycles anywhere in the entire linked structure.
Your code should preferably run in O(n) time and use only O(1) memory.

题目大意:

给两个单向链表,返回他们的交接处,如果没有交接,则返回空指针,只能使用O(1)的额外空间,且不可以修改原链表。

Solutions:

统计出两个链表的节点数,让长的那个从头去掉相差额的结点,则相遇即相交。

Code in C++:

/**
 * 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) {
        if(!headA||!headB) return NULL;
        int counta=0;
        int countb=0;
        ListNode* a= headA;
        ListNode* b= headB;
        while(a)
        {
            counta++;
            a=a->next;
        }
        while(b)
        {
            countb++;
            b=b->next;
        }
        int dif = counta-countb;

            for(int i=abs(dif);i>0;i--)
            {
                if(dif > 0)
                    headA=headA->next;
                else headB=headB->next;
            }
        while(headA&&headB&&headA!=headB)
        {
            headA=headA->next;
            headB=headB->next;
        }
        ListNode * res;
        headA==headB?res=headA:res=NULL;
        return res;

    }
};