题目:给你两个单链表的头节点 headA
和 headB
,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null
方法:分析一下如果是两个链表有相交的话,那么相交的部分一定是在后面。
假设如果是两个一样长度的链表找到他们相交的节点的话,就可以直接定义两个指针分别指向两个链表的头节点,进行比较两个指针指向的节点是否是相等的,如果不相等的话同时后移,这样的问题就好处理了。
那么我们怎么才能让两个链表变成长度相同的呢。假设长链表长度为m,短链表长度为n,那么长链表的前m-n个节点肯定是无用的,需要跳过。这样处理之后就可以当成两个长度相等的链表进行处理了。
题解:
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode* curA = headA;
ListNode* curB = headB;
int lenA = 0;
int lenB = 0;
while(curA != NULL){ //计算A链表的长度
lenA++;
curA = curA->next;
}
while(curB != NULL){ //计算B链表的长度
lenB++;
curB = curB->next;
}
curA = headA;
curB = headB;
if(lenB > lenA){ //让curA指向长链表
swap(lenA,lenB);
swap(curA,curB);
}
int size = lenA - lenB;
while(size --){
curA = curA->next; //长链表的指针向后移动size个单位
}
while(curA != NULL){
if(curA == curB){
return curA; //找到啦
}
else{
curA = curA->next;
curB = curB->next;
}
}
return NULL; //移动到最后没有发现相同的节点则没有相交
}
};