目录
题目:链表相交
简简单单的题让出题人给描述复杂啦,第一次看难免云里雾里,知其然不知其所以然。
这道题记住一点,什么情况下相交? 就是链表的两个指针指向同一个地址的时候就是相交了。
有图有真相:上图
图中很明显,两条链表捋直了 ,他们都具有相同的C1,所以在C1的地方是相交的。
上图:
其实到这里解题思路就清晰了,具体思路和实在看思路与代码中 ↓。
思路:
- //先求出两个链表的长度
- //再让两个链表对齐
- //两个链表同时往后遍历
- //有相同的指针就返回相同的指针
- //没有相同的指针就返回null
代码:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
import java.util.*;
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
//先求出两个链表的长度
//再让两个链表对齐
//两个链表同时往后遍历
//有相同的指针就返回相同的指针
//没有相同的指针就返回null
ListNode curA=headA;// 派出链表A的一个头结点分身,好操作自家的队伍
ListNode curB=headB;//派出链表B的一个头结点分身,好操作自家的队伍
int lengthA=0;
int lengthB=0;
while(curA!=null){// 计算A链表的长度
lengthA++;
curA=curA.next;
}
while(curB!=null){//计算B链表的长度
lengthB++;
curB=curB.next;
}
curA=headA;// 分身A干完事情回归头结A
curB=headB;//分身B干完事情回归头结点B
if(lengthA<lengthB){// 保证下面操作的一致性;
int tmp1=lengthA;
lengthA=lengthB;
lengthB=tmp1;
ListNode tmp2=curA;
curA=curB;
curB=tmp2;
}
int dif=lengthA-lengthB; //找出两个的差值
while((dif--)>0){// 以后记住没有傀儡节点的情况下> 表示走n步,>= 表示走n+1步。
curA=curA.next;
}
while(curA!=null){
if(curA==curB){
return curB;
}
curA=curA.next;
curB=curB.next;
}
return null;
}
}