description:
https://leetcode.com/problems/intersection-of-two-linked-lists/
code.1:
/**
* 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=0, lenB=0;
ListNode *tempA = headA, *tempB = headB;
while (tempA != NULL || tempB != NULL) {
if (tempA != NULL) {
++lenA;
tempA = tempA->next;
}
if (tempB != NULL) {
++lenB;
tempB = tempB->next;
}
}
int diff = lenA - lenB;
tempA = headA;
tempB = headB;
if (diff > 0) {
while(diff--) tempA = tempA->next;
} else if (diff < 0) {
while(diff++) tempB = tempB->next;
}
while(tempA != NULL && tempA != tempB) {
tempA = tempA->next;
tempB = tempB->next;
}
if (tempA == NULL) {
return NULL;
} else {
return tempA;
}
}
};
result.1:
code.2:
/**
* 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 *tempA = headA, *tempB = headB;
while (tempA != tempB) {
tempA = tempA ? tempA->next : headB;
tempB = tempB ? tempB->next : headA;
}
return tempA;
}
};
result.2:
personal opinion:
Notice that {
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.
}
thank the author of https://www.cnblogs.com/grandyang/p/4128461.html