原题链接在这里:https://leetcode.com/problems/intersection-of-two-linked-lists/
思路: 1. 找到距离各自tail 相同距离的起始ListNode,可以通过两个pointer,长的那个先移动Math.abs(lenA-lenB).
2. 两个pointer各自移动直到找到相同的ListNode.
Node: 1. 若有intersection,最后的点必须相同,若最后的点不同,则没有intersection.
2. 不用比较node.val,可以直接比较nodeA == nodeB.
3. 找到相同点后,说明找到了intersection的头,不用担心后面会开叉,这是single linked list.
AC Java:
/**
* 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) {
if(headA == null || headB == null){
return null;
}
ListNode pointA = headA;
ListNode pointB = headB;
int lenA = 1;
int lenB = 1;
while(pointA.next != null){
pointA = pointA.next;
lenA++;
}
while(pointB.next != null){
pointB = pointB.next;
lenB++;
}
if(pointA != pointB){
return null;
}
pointA = headA;
pointB = headB;
if(lenA > lenB){
int step = 0;
while(step < (lenA - lenB)){
pointA = pointA.next;
step++;
}
}else{
int step = 0;
while(step < (lenB - lenA)){
pointB = pointB.next;
step++;
}
}
while(pointA != pointB){
pointA = pointA.next;
pointB = pointB.next;
}
return pointA;
}
}