思路:首先先计算两个链表的长度,对应较长的链表先循环到和较短的链表一样的长度,然后两者再一起往前走,知道两者找到相交节点或者走到空指针。
这里要注意的是:只要两者有交点而且不是最后一个节点的时候,那么它们剩下的所有节点都是一样的,因为这是链表,指针指向的下一个是地址,所以既然有交点那么它的下一个指针都是指向同一个地方,这也是我一开始没搞懂的,一开始我以为就类似两条线一样相交有个交点那样子。
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) {
int lenA = 0, lenB = 0;
ListNode* tmpA = headA;
ListNode* tmpB = headB;
while(tmpA != nullptr){
lenA++;
tmpA = tmpA->next;
}
while(tmpB != nullptr){
lenB++;
tmpB = tmpB->next;
}
int cnt = lenA - lenB;
if(lenB > lenA){
tmpA = headA;
headA = headB;
headB = tmpA;
cnt = lenB - lenA;
}
tmpA = headA;
tmpB = headB;
while(cnt > 0){
cnt--;
tmpA = tmpA->next;
}
while(tmpA != tmpB && tmpA != nullptr){
tmpA = tmpA->next;
tmpB = tmpB->next;
}
return tmpA;
}
};
JavaScript代码:
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} headA
* @param {ListNode} headB
* @return {ListNode}
*/
var getIntersectionNode = function(headA, headB) {
let lenA = 0, lenB = 0;
let tmpA = headA, tmpB = headB;
while(tmpA != null){
tmpA = tmpA.next;
lenA++;
}
while(tmpB != null){
tmpB = tmpB.next;
lenB++;
}
if(lenB > lenA){
tmpA = headA;
headA = headB;
headB = tmpA;
}
let cnt = Math.abs(lenA - lenB);
while(cnt > 0){
headA = headA.next;
cnt--;
}
while(headA != headB && headA != null){
headA = headA.next;
headB = headB.next;
}
return headA;
};