声明:题目来源:力扣(LeetCode)
输入两个链表,找出它们的第一个公共结点。
题目链接:相交链表
编写一个程序,找到两个单链表相交的起始节点。
示例1:
在节点 c1 开始相交。
示例2:
两链表不相交,返回NULL。
解题思路:
- 首先需要判断两个链表长度是否相等,使用两个指针分别以相等的速度遍历两个链表,判断哪个链表长,并计算出差值 d。
- 再使用两个指针同时从表头出发,指向长链表的指针先走 d 个节点,两者再同时走。
- 判断两指针值是否相等,若相等则返回该节点的地址。
- 遍历完依然不相等,返回NULL。
以下代码可供参考:
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
if(headA == NULL || headB == NULL){
return NULL;
}
struct ListNode *pA = headA;
struct ListNode *pB = headB;
while(pA->next && pB->next){
pA = pA->next;
pB = pB->next;
}
int IsALonger;
if(pA->next){
IsALonger = 1;
}
else{
IsALonger = 0;
}
struct ListNode *rear = IsALonger ? pA : pB;
int advance = 0;
for( ; rear->next; ++advance){
rear = rear->next;
}
pA = headA;
pB = headB;
for(int i = 0;i < advance;++i){
if(IsALonger){
pA = pA->next;
}
else{
pB = pB->next;
}
}
while(pA && pB){
if(pA == pB){
break;
}
pA = pA->next;
pB = pB->next;
}
return pA;
}
来源:https://blog.csdn.net/weixin_44788162/article/details/102729110