(Java)leetcode-160 Intersection of Two Linked Lists

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:
Here Insert Picture Description

begin to intersect at node c1.

Example 1:
Here Insert Picture Description

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:
Here Insert Picture Description

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:

Here Insert Picture Description

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.

Published 143 original articles · won praise 45 · views 70000 +

Guess you like

Origin blog.csdn.net/z714405489/article/details/89211783