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.
翻译:
编写程序以查找两个单链表的交点开始的节点。
例如,以下两个链表:
答:A1→A2 ↘ C1→C2→C3 ↗ B:B1→B2→B3
开始在节点c1相交。
笔记:
- 如果两个链表都没有交集,返回
null
。 - 链表在函数返回后必须保留其原始结构。
- 您可以假定整个链接结构中没有任何循环。
- 您的代码应优先在O(n)时间内运行,并且仅使用O(1)内存。
思路:一开始想到从链表一拿出一个节点,遍历链表二中所有的节点,判断是否有重复的。但超时了,答案思路一种是先算出链表长度,把长的链表去头与短链表长度相同,再逐一判断。第二种就是下面的思路,两次迭代,第一次迭代之后无重复则两个末尾分别指向另一个链表头,这样就相当于让两个链表长度相同,再次迭代即可。
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if(headA == null || headB == null) return null;
ListNode a = headA;
ListNode b = headB;
while(a != b){
if(a == null){
a = headB;
}else{
a = a.next;
}
if(b == null){
b = headA;
}else{
b = b.next;
}
}
return a;
}