[lintcode medium]Intersection of Two Linked Lists

Intersection of Two Linked Lists

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

Example

The following two linked lists:

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

begin to intersect at node c1.

Note
  • 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.
Challenge

Your code should preferably run in O(n) time and use only O(1) memory.

 

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;      
 *     }
 * }
 */
public class Solution {
    /**
     * @param headA: the first list
     * @param headB: the second list
     * @return: a ListNode 
     */
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        // Write your code here
        if(headA==null || headB==null) return null;
        
        ListNode result;
        ListNode hA=headA;
        ListNode hB=headB;
        
        int lenA=1;
        int lenB=1;
        
        while(hA.next!=null)
        {
            hA=hA.next;
            lenA++;
        }
        
        while(hB.next!=null)
        {
            hB=hB.next;
            lenB++;
        }
        
        int n=Math.abs(lenA-lenB);
        ListNode fast=null;
        ListNode slow=null;
        if(lenA==lenB)
        {
            fast=headA;
            slow=headB;
            if(fast.val==slow.val)
            return result=headA;
            else return null;
        }
        else if(lenA>lenB)
        {
            fast=headA;
            slow=headB;
        }
        
        else
        {
            fast=headB;
            slow=headA;
        }
        
        for(int i=1;i<=n;i++)
        {
            fast=fast.next;
            if(fast.next==null)
            {
                return result=null;
            }
        }
        
        while(slow.val!=fast.val)
        {
            slow=slow.next;
            fast=fast.next;
        }
        
        result=slow;
        
        return result;
    }    
}

 

posted on 2015-12-10 06:10  一心一念  阅读(106)  评论(0编辑  收藏  举报

导航