文章目录
题目
解题
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* getIntersectionNode(struct ListNode* headA,struct ListNode* headB) {
struct ListNode* pa = headA;
struct ListNode* pb = headB;
if (!headA || !headB) return NULL;
while (pa != pb) {
// 如果pA到达链表A的末尾,则转到链表B的头
pa = (pa == NULL) ? headB : pa->next;
// 如果pB到达链表B的末尾,则转到链表A的头
pb = (pb == NULL) ? headA : pb->next;
}
return pa;
}
笔记
一. 链表节点定义和注意
1. 节点定义
struct ListNode {
int val;
struct ListNode* next;
};
第一个这里要注意,我在函数前定义后显示重复定义该节点结构体,原因是力扣的前面备注了,意思是已经定义了,所以不用重复定义。
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
第二个就是我发现不能在头部定义后,我在函数内部定义,会产生一个新的报错,即:
solution.c: In function ‘getIntersectionNode’
Line 15: Char 25: error: initialization of ‘struct ListNode *’ from incompatible pointer type ‘struct ListNode *’ [-Wincompatible-pointer-types] [solution.c]
15 | struct ListNode *pa=headA;
| ^~~~~
我的问题:
原因是:
C 语言的类型作用域规则
在 C 语言中:
结构体的定义必须在使用之前完成(即“完整类型”)。
如果只是 前向声明(Forward Declaration)(如 struct ListNode;),编译器知道 struct ListNode 存在,但不知道它的具体结构(不完整类型)。函数参数 struct ListNode* headA 使用的是前向声明的类型,而函数内部 struct ListNode { … } 是重新定义的新类型,二者不兼容。
解决办法是:
①显性类型转换
struct ListNode* pa = (struct ListNode*)headA;
②把定义放在函数前,这里力扣已经定义所以不用写了
2. 多加判断
根据题目,如果A 和B链表不存在交点就返回空,需要判断两个链表是不是都是空链表,如果任一是空链表肯定不相交,直接返回NULL
if (!headA || !headB) return NULL;
注意:
NULL 表示空指针,通常定义为 *0 或 (void )0
! 是逻辑非运算符:
如果 headA 是 NULL,!headA 就是 1(true)。
如果 headA 不是 NULL,!headA 就是 0(false)。