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; } }