LeetCode – Intersection of Two Linked Lists (Java)

Problem

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.

Java Solution

First calculate the length of two lists and find the difference. Then start from the longer list at the diff offset, iterate though 2 lists and find the node.

/**
 * 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) {
        int len1 = 0;
        int len2 = 0;
        ListNode p1=headA, p2=headB;
        if (p1 == null || p2 == null)
            return null;
 
        while(p1 != null){
            len1++;
            p1 = p1.next;
        }
        while(p2 !=null){
            len2++;
            p2 = p2.next;
        }
 
        int diff = 0;
        p1=headA;
        p2=headB;
 
        if(len1 > len2){
            diff = len1-len2;
            int i=0;
            while(i<diff){
                p1 = p1.next;
                i++;
            }
        }else{
            diff = len2-len1;
            int i=0;
            while(i<diff){
                p2 = p2.next;
                i++;
            }
        }
 
        while(p1 != null && p2 != null){
            if(p1.val == p2.val){
                return p1;
            }else{
 
            }
            p1 = p1.next;
            p2 = p2.next;
        }
 
        return null;
    }
}
Category >> Algorithms >> Interview  
If you want someone to read your code, please put the code inside <pre><code> and </code></pre> tags. For example:
<pre><code> 
String foo = "bar";
</code></pre>
  • Udaydeep Thota

    // Time Complexity: O(elements in first list + elements in second list)
    // Space Complexity: O(elements in first list)
    public Node intersectionNodeInList(Node head1, Node head2) {

    if(head1==null || head2==null)
    return null;

    HashSet nodeStoreSet = new HashSet();
    Node current1 = head1;
    Node current2 = head2;

    while(current1!=null) {

    nodeStoreSet.add(current1);
    current1=current1.next;

    }

    while(current2!=null) {

    if(nodeStoreSet.contains(current2))
    return current2;
    current2=current2.next;
    }

    return null;

    }

  • ramkrishna

    p1.val==p2.val is incorrect as doesn’t compare the all the nodes next to it.
    It only compares with two nodes.Replace it with p1==p2
    ex:
    56 79 78 13 97 64 47 20 80 85
    97 6 46 83 54 47 20 81 85
    It will give ans 47 20 80 85
    But correct ans is 85

  • Ayush

    if space is not an issue put both in stack ..then pop can compare til both are same.

  • Sitian Liu

    The last while loop only works if the lists are the same length. The goal is to start at a point on both list where they have even number of elements left

  • Sitian Liu

    What if you aren’t allowed to modify the lists and want to keep the space down to O(1)?

  • Anand Varma

    Reverse both the lists and iterate the reversed lists as long as the nodes are the same. When the nodes differ, the element before that is the intersection point.

  • Anup

    Also assignments:
    p1=headA;
    p2=headB;

    are done twice unnecessarily.

    BTW, thanks for the program, programcreek 🙂

  • George

    Agree!!

  • disqus_NInBSQ2Jb7

    the last while loop is fine ..i dont understand the need to calculate difference and moving pointers

  • Shawn

    I think we should not do if(p1.val == p2.val){, but just if (p1 == p2)..