相关标签
一、题目要求
二、题解和代码实现
1.题解
2.代码实现
代码如下(示例):
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
//hash表解法
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
HashSet<ListNode> set = new HashSet<>();
while (headA!=null){//遍历
set.add(headA);//存进hash表中
headA = headA.next;
}
while (headB!=null){//遍历
if (set.contains(headB)){//当找到第一个在hsah表的元素,就是第一个相交的节点
return headB;
}
headB = headB.next;
}
return null;
}
}
/**
* 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) {
if(headA ==null ||headB ==null) { //判断头节点是否有为空
return null;
}
ListNode pA= headA; //赋值给pA
ListNode pB = headB; //赋值给pB
while(pA != pB){ //判断头节点是否相同
//判断pA是否为null,当是null时候,证明已经走完headA链表,没有找到与pB相同的节点,把headB赋值给pA
pA = pA==null? headB : pA.next;
//判断pB是否为null,当是null时候,证明已经走完headB链表,没有找到与pA相同的节点,把headA赋值给pB
pB = pB==null? headA : pB.next;
//最重要的一点:当链表长度不同时 会第二轮循环比较, 第二轮 体现在如果pA或pB相交就返回交点, 不相交最后就是null==null
//[原因是,如果是headA长度比headB长度要长,当转换后后如果相遇则为交点(在第一轮移动中恰好抹除了长度差),
//两个指针等于移动了相同的距离, 有交点就返回, 当无交点就是pA和pB各走了(headA和headB) 两条指针的长度]
}
return pA; //当走到这一步时候,前面的循环不成立,所以pA == pB,直接返回pA节点
}
}