## 具体请看 LeetCode
## 题目详解 代码随想录
## 思路
一开始看代码随想录中的思路解析时,不太清楚为什么需要将链表a 和链表b 按照尾部对齐,然后依次比较判断同一个位置的指针是否相等就可以找到答案。在仔细阅读题目之后,发现两个链表如果存在相交节点,那么它们相交节点之后的所有节点都是相同的(可以从图中很容易就看出来),那么我们只需要比较短链表的长度次就可以判断是否存在相交节点了,根本不用考虑长链表的前半部分。
## 代码
/**
* 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) {
// 定义临时变量,避免修改原链表
ListNode curA = headA;
ListNode curB = headB;
// 定义链表长度
int lenA = 0;
int lenB = 0;
// 获取链表长度,使用临时变量
while (curA != null) {
lenA++;
curA = curA.next;
}
while (curB != null) {
lenB++;
curB = curB.next;
}
// 将临时变量重新指向头节点
curA = headA;
curB = headB;
// 将较长的链表设置为链表a 方便计算
if (lenB > lenA) {
// 进行交换
int len = lenB;
lenB = lenA;
lenA = len;
//链表头指针也要交换
ListNode cur = curB;
curB = curA;
curA = cur;
}
// 计算出两个链表之间的长度差c,并将链表a 的头节点移动c 个位置,保证两个链表尾节点对应
int lenC = lenA - lenB;
while (lenC > 0) {
curA = curA.next;
lenC--;
}
// 循环判断curA 和 curB 指向的节点是否相同,相同则为相交节点,否则返回null
while (curA != null) {
// 相同为相交节点
if (curA == curB) {
return curA;
}
curA = curA.next;
curB = curB.next;
}
return null;
}
}