题目链接:LeetCode160展开目录
题解展开目录
两种做法,第一种,创建一个 HashSet,先把 A 链表的所有节点保存到 Set 中,然后遍历 B 链表,将 B 链表的所有节点保存进去,保存时进行判断,如果 Set 中已经有这个节点了,就直接 return 这个节点,否则就加进去
第二种做法,定义两个节点 end1,end2,定义两个变量 len1,len2,遍历 A 链表,将 end1 指到 A 链表的尾部,然后记录 A 链表的长度 len1,B 链表也是如此,然后判断其尾节点是否相同,如果尾节点不相同就直接 return null,反之,让 len1 和 len2 中较大的那个链表先遍历 Math.abs (len1-len2) 的长度,然后两个链表再同时遍历,遍历到节点相同时停止,返回该节点
代码展开目录
- /**
- * 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) {
- ListNode end1 = headA,end2 = headB;
- int len1 = 0,len2 = 0;
- while(end1 != null) {
- end1 = end1.next;
- len1++;
- }
- while(end2 != null) {
- end2 = end2.next;
- len2++;
- }
- if(end1 != end2)
- return null;
- for(int i = 1;i <= Math.abs(len1-len2);i++) {
- if(len1 > len2)
- headA = headA.next;
- else
- headB = headB.next;
- }
- while(headA != null && headB != null) {
- if(headA == headB)
- return headA;
- headA = headA.next;
- headB = headB.next;
- }
- return null;
- }
- }