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.
Java Solution
1 public class ListNode { 2 int val; 3 ListNode next; 4 ListNode(int x) { 5 val = x; 6 next = null; 7 } 8 } 9 10 11 public ListNode getIntersectionNode(ListNode headA, ListNode headB) { 12 ListNode p1 = headA, p2 = headB; 13 int len1 = 0, len2 = 0; 14 while (p1 != null) { 15 p1 = p1.next; 16 len1++; 17 } 18 while (p2 != null) { 19 p2 = p2.next; 20 len2++; 21 } 22 p1 = headA; 23 p2 = headB; 24 if (len1 > len2) { 25 for (int i = 0;i < len1 - len2; i++) { 26 p1 = p1.next; 27 } 28 } else { 29 for (int i = 0;i < len2 - len1; i++) { 30 p2 = p2.next; 31 } 32 } 33 while (p1 != p2) { 34 p1 = p1.next; 35 p2 = p2.next; 36 } 37 return p1; 38 }