题目描述
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.
解题思路
先遍历两个链表,求出二者长度之差sizeA - sizeB,让后让长链表head指针向后走sizeA - sizeB个节点,再次遍历链表,若AB中有节点地址相同则返回该节点。
java代码
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if (headA == null || headB == null) return null;
ListNode headACopy = headA, headBCopy = headB;
int sizeA = 0, sizeB = 0;
while (headA != null){
headA = headA.next;
sizeA++;
}
while (headB != null){
headB = headB.next;
sizeB++;
}
headA = headACopy; headB = headBCopy;
if (sizeA > sizeB){
for (int i = 0; i < sizeA -sizeB; i++){headA = headA.next;}
}
else if (sizeB > sizeA){
for (int i = 0; i < sizeB -sizeA; i++){headB = headB.next;}
}
while(headA != null && headB != null){
if (headA.hashCode() == headB.hashCode()) return headA;
headA = headA.next;
headB = headB.next;
}
return null;
}