单链表题目:相交链表,寻找相交的结点并返回
题目描述:给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。
两种思想
1、利用哈希表可以快速查找的特性,将单链表a存在哈希表中,同时遍历单链表b与哈希表中点元素进行比较,判断是否在哈希表中,
若不存在,则继续遍历下一个;若当前阶段存在,且后面节点也存在,则返回该节点。
2、利用双指针,pa一个从a的头节点开始遍历,pb从b的头节点开始遍历,当pa遍历a结束时从b重新开始遍历,当pb遍历结束b后吗,从a重新开始遍历,若pa,pb同时指向一个结点或同时为null,则返回该节点或说明两链表不相交。
Definiton for singly-linked list.//说明接下来的代码将定义一个单链表
piblic class ListNode{//定义公共类ListNOde,表示单链表的结点
int val;//用于存储节点的值
ListNode next;
ListNode(int x){//定义构造函数,用于接受整形参数x
val=x;
next=null;//初始化为空
}
}
public class Solution{
public ListNode getIntersectNode(ListNode headA,ListNode headB)//这个方法用来接收两个LIstNode类型的参数headA和headB
set<ListNode> visited =new HashSet<ListNode>;//创建一个set集合visited存放访问过a的结点
ListNode temp=headA;//这里temp变量用于遍历链表headA
while (temp !=null){
visited.add(temp};//将当前访问过的结点都加入visited集合中,表示该节点已访问
temp=temp.next;
}
temp =headB;
while(temp!=null){
if(visited.contains(tamp)){
return temp;//判断集合visited中是否含有当前节点temp。即判断是否是ab相交的节点
}
temp=temp.next;
}
return null
}
public class Solution {
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;
}
}