题目:找到两个链表相交叉的第一个结点
注意:
两个链表有交叉的部分,并且题目需要保持链表的结构,不能轻易去反转。
思想:
通过遍历A链表,将所有的结点放入hashset中。
之后遍历B链表,依次判断hashset中是否有正在遍历的当前结点,如果有,就直接返回,就是开始交叉的结点。
- 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) {
HashSet<ListNode> set=new HashSet<>();
ListNode p=headA;
//将a链表的所有结点放入set中
while(p!=null){
set.add(p);
p=p.next;
}
//按顺序判断b链表中的结点在set中是否存在,如果存在就是第一交叉点。
ListNode q=headB;
while(q!=null){
if(set.contains(q))
return q;
q=q.next;
}
return null;
}
}
- javascript
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} headA
* @param {ListNode} headB
* @return {ListNode}
*/
var getIntersectionNode = function(headA, headB) {
var set=new Set();
var p=headA;
while(p!=null){
set.add(p);
p=p.next;
}
var q=headB;
while(q!=null){
if(set.has(q))
return q;
q=q.next;
}
return null;
};