【问题描述】
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.
【思路】
如果两个ListNode尾节点相同,则一定存在公共节点。
将长的List移步size1-size2步长后开始依次比较,直到找到相同节点后返回。
【code】
/**
* 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 t1 = headA;
ListNode t2 = headB;
int size1 = 1, size2 = 1;
while (t1.next != null) {
size1++;
t1 = t1.next;
}
while (t2.next != null) {
size2++;
t2 = t2.next;
}
if (t1.val != t2.val) {
return null;
} else {
int t = Math.abs(size1 - size2);
if (size1 > size2) {
t1 = headA;
t2 = headB;
} else {
t1 = headB;
t2 = headA;
}
while ((t--) != 0) {
t1 = t1.next;
}
while (t1 != null && t2 != null && t1 != t2) {
t1 = t1.next;
t2 = t2.next;
}
return t1;
}
}
}