import java.util.HashSet;
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) { this.val = val; }
}*/
public class Solution {
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
//我能想到的最简单的思路就是: //两层循环,依次遍历两个ListNode,当两个链表中,某个节点的下一个节点与另外一个链表中的一个节点的下一个 //节点相同,那么,直接返回下一个节点,结束 //《上面这个思路时间复杂度O(n^2),是暴力解,不好》 if(pHead1 == null || pHead2==null){ return null; } if(pHead1== pHead2){ return pHead1; } //【推荐】还有一种思路是: //建立一个set,将第一个链表的节点一个个放入set中,然后遍历第二个链表,判断set中时候包含第二个节点 //如果第二个链表的某个节点已经存在于这个set中,则直接返回即可,程序结束 //将第一个链表节点放入set中 HashSet<ListNode> set = new HashSet<>(); while(pHead1 != null){ set.add(pHead1); if(pHead1.next ==null){ break; } pHead1 = pHead1.next; } //判断节点是否存在于set中 while(pHead2 != null){ if(set.contains(pHead2)){ return pHead2; } if(pHead2.next == null){ break; } pHead2 = pHead2.next; } return null; }
}