题目描述:
Write a program to find the node at which the intersection of two singly linked lists begins.
For example, the following two linked lists:
A: a1 → a2 ↘ c1 → c2 → c3 ↗ B: b1 → b2 → b3
begin to intersect at node c1.
Notes:
- If the two linked lists have no intersection at all, return
null
. - The linked lists must retain their original structure after the function returns.
- You may assume there are no cycles anywhere in the entire linked structure.
- Your code should preferably run in O(n) time and use only O(1) memory.
/*
* 思路:遍历一个链表,然后同时为他创建一个哈希表记录元素
* 遍历另一个链表,同时验证是否在第一个链表中有,若有则说明为交叉点
* */
public static ListNode getIntersectionNode(ListNode headA, ListNode headB) {
// 创建一个哈希表
int[] cnt = new int[1000000];
for(int i=0; i<1000000; i++){//赋初值
cnt[i] = 0;
}
boolean b = false;//判断结果的指标
ListNode result = null;//存放结果节点
// 遍历链表A并将元素记录进哈希表
while(headA.next != null){
cnt[headA.val] = 1;
headA = headA.next;
}
// 遍历链表B 并判定是否有交叉元素
while(headB.next != null){
if(cnt[headB.val] == 1){//说明找到了交叉节点
result = headB;
b = true;
break;
}
headB = headB.next;
}
if(b){
return result;
}else{
return null;
}
}
public ListNode getIntersectionNode1(ListNode headA, ListNode headB) {
//方法2 时间复杂度在1ms
int l1 = 0;
int l2 = 0;
ListNode t1 = headA;
ListNode t2 = headB;
while(t1 != null){//获取链表长度
l1++;
t1 = t1.next;
}
while(t2 != null){
l2++;
t2 = t2.next;
}
//不相等的处理方法
while(l1 > l2){
headA = headA.next;
l1--;
}
while(l2 > l1){
headB = headB.next;
l2--;
}
//开始比较
while(headA != headB){
headA = headA.next;
headB = headB.next;
}
return headA;//返回headA 找到了就是相等的节点,没找到就是null
}