面试题 02.07. 链表相交 - 力扣(LeetCode) (leetcode-cn.com)
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
// 俩个链表一个短一个长,短的走完了就去走长的,如果相交则一定会相遇
// 让长度更长的链表的指针指向的结点位置与长度短的链表起始位置对其
// 即让长度更长的链表指针移动俩个链表长度的差值个位置
// 之后遍历循环,若俩指针相等,则表示相交
typedef struct ListNode ListNode;
// 俩个指针标志分别指向俩个链表的头结点
ListNode* curA = headA;
ListNode* curB = headB;
// 求出俩个链表各自的长度
int longA = 0, longB = 0;
while(curA!=NULL) {
longA++;
curA = curA->next;
}
while(curB!=NULL) {
longB++;
curB = curB->next;
}
// 注意当确定完链表长度后,指针全都指向了链表的最尾部,所以要重新指回头部
curA = headA;
curB = headB;
// 俩个链表长度的差值
int chazhi = abs(longA-longB);
// 让长度更长的链表指针移动差值个位置
if(longA > longB) {
while(chazhi--) {
curA = curA->next;
}
}else {
while(chazhi--) {
curB = curB->next;
}
}
// 判断相交结点
while(curB!=NULL && curA!=NULL) {
if(curA == curB) {
return curB;
}
else {
curA = curA->next;
curB = curB->next;
}
}
return NULL;
}