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 Alen =0;
int Blen =0;
//ListNode curA = new ListNode(); //这个是创建一整个链表,而不是创建指针。
ListNode curA = headA; //这个才是创建相对应的指针
ListNode curB = headB;
//分别求出A 、B的长度
while(curA != null){
Alen++;
curA =curA.next;
}
while(curB != null){
Blen++;
curB =curB.next;
}
//判断长度之后还要将指针指向头结点
curA = headA;
curB = headB;
//统一将较长的链表叫做A链表,较短的叫做B链表
if (Blen > Alen) {
//先将长度交换位置
int temp ;
temp =Alen;
Alen = Blen;
Blen =temp;
//再将指针交换位置
ListNode tempNode;
tempNode = curA;
curA =curB;
curB =tempNode;
}
//求出差值
int gap = Alen - Blen;
while(gap-- >0){
curA = curA.next;
}
//判断当A是否为空
while(curA != null){
if(curA == curB){
return curA; //题目中要求返回的是结点,这里是curA,不是curA.val;
}
curA =curA.next;
curB =curB.next;
}
return null;
}
}
这是笔者能想到的最基本的思路,再结合代码随想录完成相应的代码。
解法二:
该解法是在力扣当中学习到的解法。
具体解法
1.指针 pA 指向 A 链表,指针 pB 指向 B 链表,依次往后遍历
2.如果 pA 到了末尾,则 pA = headB 继续遍历
3.如果 pB 到了末尾,则 pB = headA 继续遍历
4.比较长的链表指针指向较短链表head时,长度差就消除了
5.如此,只需要将最短链表遍历两次即可找到位置
图示为:
具体的代码为:
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if (headA == null || headB == null) return null;
ListNode pA = headA, pB = headB;
while (pA != pB) {
pA = pA == null ? headB : pA.next;
pB = pB == null ? headA : pB.next;
}
return pA;
}
评论中对该解法的评论:走到尽头见不到你,于是走过你来时的路,等到相遇时才发现,你也走过我来时的路。