LeetCode——Intersection of Two Linked Lists
# 160
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.
The purpose of this question is to find the intersection of two linked lists. At first, the idea is to use two pointers to traverse the two lists, but if the length of the two lists is different, it is impossible to compare to the same node. So in order to solve this problem, it is thought that the length difference between the two linked lists should be calculated first, so that the pointer of the long linked list can go to the corresponding position first, and then the two pointers can go together.
- C++
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if(headA == NULL || headB == NULL)
return NULL;
int lenA = getlength(headA);
int lenB = getlength(headB);
if(lenA > lenB) {
for(int i = 0;i < lenA - lenB;i++) {
headA = headA -> next;
}
}
else {
for(int i = 0;i < lenB - lenA;i++) {
headB = headB -> next;
}
}
while(headA != NULL && headB != NULL) {
if(headA == headB) {
return headA;
}
else if(headA != headB) {
headA = headA -> next;
headB = headB -> next;
}
}
return NULL;
}
int getlength(ListNode *head) {
int len = 0;
while(head != NULL) {
len++;
head = head -> next;
}
return len;
}
};
Another idea is to define two pointers, each traversing from the beginning to the end of the list from the beginning of another list. If the two lists intersect, they will definitely meet at the intersection point, because the distance is the same. If they do not intersect, both pointers end at empty nodes in each other's list.
- C++
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if (!headA || !headB) return NULL;
ListNode *a = headA, *b = headB;
while (a != b) {
a = a ? a->next : headB;
b = b ? b->next : headA;
}
return a;
}
};