160:判断两个链表是否相交并返回相交的节点

问题

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)

题目要求O(1)的空间复杂度,所以HashSet的方法不可用

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        if(headA==null||headB==null) return null;

        ListNode l1=headA;
        ListNode l2=headB;

        int i=0;
        int j=0;
        while(l1!=null){
            l1=l1.next;
            i++;
        }

        while(l2!=null){
            l2=l2.next;
            j++;
        }

        if(l1!=l2) return null; 
        if(i>j){
            for(int p=0;p<(i-j);p++){
            headA=headA.next;
            }
        }
        else if(i<j){
            for(int q=0;q<(j-i);q++){
            headB=headB.next;
            }
        }

        while(headA!=headB){
            headA=headA.next;
            headB=headB.next;
        }
        return headA;
    }
}