题目:相交链表
分析
创建一个节点,其实是在堆
里面创建了一个ListNode
对象,而栈
里面存放的内容就是这个对象的地址
,如下图。
题目的要求是要找到A
,B
指针所指向的两个链表第一次相交的节点,相交节点也就是两个链表共有的节点。
我们看到节点1
和节点2
,虽然他们的val
值以及next
指向都是相同的,但他们却不是同一个对象,因为他们的地址
不一样。
而再看看节点3
和节点5
,无论是在链表A
中还是在链表B
中,都是同一个地址,因此这俩节点都属于两个链表相交节点。那么第一次相交节点很显然就是节点3
了。
思路
可以借助两个指针,分别以相同步伐
遍历两个链表的每个节点进行比较是否相同,(这里的相同是指两个指针存储的地址
相同,根据上面分析,地址
相同那就是节点
相同)。
考虑到两个链表可能长短不一,就让遍历完的指针指向另一个长链表
的头节点
,这样的话,等长链表
遍历结束的时候两个指针的距离恰好是短链表
的长度,你品!之后长链表
的指针指向短链表
的头节点
,此时,两个指针后面的长度是相同的,你细品!品不出来,看图吧~
代码
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
//1.特判
if(headA == null || headB == null) return null;
//2.定义两个指针
ListNode p1 = headA;
ListNode p2 = headB;
//3.遍历
while(p1 != p2){
p1 = p1.next; //同步前行
p2 = p2.next;
if(p1 == null && p2 == null) return null;
if(p1 == null) p1 = headB;
if(p2 == null) p2 = headA;
}
return p1;
}
}