topic
[Find the intersection of two single chain]
Write a program to find the node at which the intersection of two singly linked lists begins.
For example, the following two linked lists:
begin to intersect at node c1.
Example 1:
Input: intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
Output: Reference of the node with value = 8
Input Explanation: The intersected node’s value is 8 (note that this must not be 0 if the two lists intersect). From the head of A, it reads as [4,1,8,4,5]. From the head of B, it reads as [5,0,1,8,4,5]. There are 2 nodes before the intersected node in A; There are 3 nodes before the intersected node in B.
Example 2:
Input: intersectVal = 2, listA = [0,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1
Output: Reference of the node with value = 2
Input Explanation: The intersected node’s value is 2 (note that this must not be 0 if the two lists intersect). From the head of A, it reads as [0,9,1,2,4]. From the head of B, it reads as [3,2,4]. There are 3 nodes before the intersected node in A; There are 1 node before the intersected node in B.
Example 3:
Input: intersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2
Output: null
Input Explanation: From the head of A, it reads as [2,6,4]. From the head of B, it reads as [1,5]. Since the two lists do not intersect, intersectVal must be 0, while skipA and skipB can be arbitrary values.
Explanation: The two lists do not intersect, so return null.
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.
Thinking
First go over the list again two, until one reaches the end pointer, this time there are three cases:
- It has not reached the end of a described list A list longer than B
- b has not reached the end of the described B chain linked list is longer than A
- At the same time it reaches the end, as long as two lists described
For the case 1, a continued movement of the back while the list head pointer A is moved backward, when a reaches the end of counting from headA, as long as the A and B chains. At this time, while moving further and headA headB, the pointer is determined whether the same is the crossing point and the same return
Similarly the case 2
case 3 moved directly head pointer
Time complexity of O (n)
space complexity O (1)
Code
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode a = headA,b = headB;
int step = 0;
while(a != null && b != null){
a = a.next;
b = b.next;
}
while(a != null){
a = a.next;
headA = headA.next;
}
while(b != null){
b = b.next;
headB = headB.next;
}
while(headA != null || headB != null){
if(headA == headB) return headA;
else{
headA = headA.next;
headB = headB.next;
}
}
return null;
}
}
Present the results
Runtime: 1 ms, faster than 98.31% of Java online submissions for Intersection of Two Linked Lists.
Memory Usage: 34.3 MB, less than 100.00% of Java online submissions for Intersection of Two Linked Lists.