Leetcode——菜鸟笔记3(相交链表)

发布于:2025-08-09 ⋅ 阅读:(17) ⋅ 点赞:(0)

题目

在这里插入图片描述

解题

/**
 * 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)。


网站公告

今日签到

点亮在社区的每一天
去签到