解题思路:一开始想通过反转链表来做,可发现要求不能改变原来的链表结构,当然反转也可以,大不了再转回来,麻烦。比较简单的做法就是考虑到题目的意思是两个链表要有交叉肯定是在从两个链表相同元素位置一直持续到结尾,所以可以先获得两个链表的长度,使较长的链表先移动到剩下的和较短的链表长度相同,这要就可以同步移动两个链表来比较了。有个注意点是题目中两个元素交叉是指这Node相等,而不是只是Node的值相等。
/**
* 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;
}
int countA = 0;
int countB = 0;
ListNode curA = headA;
ListNode curB = headB;
while(curA != null) {
countA ++;
curA = curA.next;
}
while(curB != null) {
countB ++;
curB = curB.next;
}
if(curA != curB)
return null;
int count = 0;
if(countA >= countB) {
count = countA - countB;
curA = headA;
curB = headB;
}
else {
count = countB - countA;
curA = headB;
curB = headA;
}
while(count != 0) {
curA = curA.next;
count --;
}
while(curA != null && curA != curB) {
curA = curA.next;
curB = curB.next;
}
return curA;
}
}