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.
Credits:
Special thanks to @stellari for adding this problem and creating all test cases.
solution:
对于两个有intersection的List,无论不同处的长度是否一样,当遍历到以另个list的head为起点时,都能一起达到相同处的第一个点。所以判断两个点相等时,即可跳出遍历,输出该点。 对于没有intersection的List,在遍历完以另个list的head为起点的list,仍然没有共同点,则两个遍历点会同时到达NULL点,而此时这两个点为相同点,符合node1==node2,输出其中一个点,即Null
code:
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode *node1 = headA;
ListNode *node2 = headB;
if(headA==NULL || headB==NULL)
return NULL;
while(node1!=NULL && node2!=NULL && node1!=node2){
node1=node1->next;
node2=node2->next;
if(node1==node2)
return node1;
if(node1==NULL)
node1 = headB;
if(node2==NULL)
node2 = headA;
}
return node1;//node1==node2
}
};