💓 博客主页:C-SDN花园GGbond
⏩ 文章专栏:数据结构经典题目刨析(c语言)
目录
一.题目描述:
二、解题思路
方法一:双循环对比法
- 时间复杂度O(n^2) 空间复杂度O(1)
- 链表A中的节点依次与链表B中的每个节点比较
- 若出现节点相同,则相交且为第一个交点
- 若链表A走到空依然没有相同的节点,则不相交
- 注意:暴力解法效率较低,不建议采用
方法一实现代码
struct ListNode
{
int val;
struct ListNode *next;
};
typedef struct ListNode ListNode;
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB)
{
ListNode*pcurA=headA;
ListNode*pcurB=headB;
while(pcurA)
{
pcurB=headB;
while(pcurB)
{
if(pcurA==pcurB)
return pcurA;
pcurB=pcurB->next;
}
pcurA=pcurA->next;
}
return NULL;
}
方法二: 双指针法
1.时间复杂度O(n) 空间复杂度O(1)
2.首先遍历链表求出两个链表的长度,求得长度的差值
3.定义两个快慢指针,哪个链表长,快指针就指向哪个链表
4.两个指针分别从两个链表的第一个节点开始遍历,快指针先走出一个长度差值,之后两个指针每移动一步,比较指向的节点是否相同
5.若出现节点相同,则相交且为第一个交点
6.若两个指针走到空依然没有相同的节点,则不相交
方法二实现代码 、
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
if (headA == NULL || headB == NULL) {
return NULL; // 处理空链表情况
}
struct ListNode *pcurA = headA, *pcurB = headB;
int countA = 0, countB = 0;
// 计算链表A的长度
while (pcurA != NULL) {
countA++;
pcurA = pcurA->next;
}
// 计算链表B的长度
while (pcurB != NULL) {
countB++;
pcurB = pcurB->next;
}
// 重新指向头节点
pcurA = headA;
pcurB = headB;
// 让较长链表的指针先移动差值步
if (countA > countB) {
int diff = countA - countB;
while (diff--) {
pcurA = pcurA->next;
}
} else {
int diff = countB - countA;
while (diff--) {
pcurB = pcurB->next;
}
}
// 同步移动直到找到交点
while (pcurA != pcurB) {
pcurA = pcurA->next;
pcurB = pcurB->next;
}
return pcurA; // 返回交点或NULL
}