⭐️ 往期相关文章
💫链接1:链表分割
💫链接2:链表中倒数第k个结点(快慢指针问题)
💫链接3:leetcode 876.链表的中间结点(快慢指针问题)
💫链接4:leetcode 206.反转链表
💫链接5:leetcode 203.移除链表元素
💫链接6:合并两个有序链表
⭐️ 题目描述
🌟 leetcode链接:链表相交
1️⃣ c代码:
思路:如果两个链表相交,则最后一个结点的地址是一样的。否则就是不相交。
但是要找到相交的结点,如果进入相交结点,则两个链表到终点的距离是一样的。但是没有进入相交的时候,可能是 A
链表长度长一些也可能是 B
链表长度长一些。所以要记录 A
链表和 B
链表到终点的长度。让长度小的链表先走差距步,这样两个链表距离相交的结点就是一样的距离了,然后遍历判断当前结点是否相等即可。相等结点就是相交点。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/*
思路:如果两个链表相交,则最后一个结点的地址是一样的。否则就是不相交
但是要找到相交的结点,如果进入相交结点,则两个链表到终点的距离是一样的。但是没有进入相交的时候,
可能是A链表长度长一些也可能是B链表长度长一些。所以要记录A链表和B链表到终点的长度。让长度小的链表
先走差距步,这样两个链表距离相交的结点就是一样的距离了,然后遍历遍历判断当前结点是否相等即可。
*/
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
struct ListNode* tempHeadA = headA;
struct ListNode* tempHeadB = headB;
// 找A链表的尾结点
int lengthA = 1; // 由于是找尾结点所以lengthA的长度会少1 所以默认从1开始记录
while (tempHeadA->next != NULL) {
tempHeadA = tempHeadA->next;
lengthA++;
}
// 找B链表的尾结点
int lengthB = 1;
while (tempHeadB->next != NULL) {
tempHeadB = tempHeadB->next;
lengthB++;
}
// 判断尾结点是否相同 不同则不相交
if (tempHeadB != tempHeadA) {
return NULL;
}
// 来到这里 A链表和B链表一定是相交的
int gap = abs(lengthA - lengthB);
// 假设 A长B短 lengthA > lengthB
struct ListNode * longHead = headA;
struct ListNode * shortHead = headB;
// 否则 A短B长
if (lengthB > lengthA) {
longHead = headB;
shortHead = headA;
}
// 先让 长的链表走差距步
while (gap--) {
longHead = longHead->next;
}
// 来到这里 A链表和B链表进入相交的距离一样
// 若不相等就继续迭代往后走
while (longHead != shortHead) {
longHead = longHead->next;
shortHead = shortHead->next;
}
// 来到这里说明 循环为假结束,A链表和B链表当前结点相等
return shortHead;
}