参考文章:链表相交,找出交点
思路:
这个问题最需要注意的地方在于,相交部分的链表节点地址是一样的,而不是仅节点数值相等,可以说是题意没有说清楚吧。思路是先分别求出两链表的长度,然后相减得到差值,将长度较长的链表先遍历到等同于差值数的地方,然后再两个链表同时遍历,看当前节点的地址是否相同,若不同则接着遍历,直到找到地址相同的节点或者遍历完两个链表。参考图解过程(图片转载自代码随想录):
在示例图中,链表A长度较长,与链表B的长度相差为4,所以让curA往右移动4个节点,然后再与curB一起移动并判断当前两指针所指的节点地址是否相同。
本题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) {
int lenA = 0, lenB = 0;
ListNode rn = headA;
while(rn != null){
rn = rn.next;
lenA++;
}
rn = headB;
while(rn != null){
rn = rn.next;
lenB++;
}
int gap;
ListNode cur1, cur2;
if(lenA > lenB){
gap = lenA - lenB;
cur1 = headA;
cur2 = headB;
}else{
gap = lenB - lenA;
cur1 = headB;
cur2 = headA;
}
while(gap--!=0){
cur1 = cur1.next;
}
while(cur1 != null){
if(cur1 == cur2){
return cur1;
}else{
cur1 = cur1.next;
cur2 = cur2.next;
}
}
return null;
}
}