/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 * };
 */

/**
 * @author Senky
 * @date 2023.04.19
 * @par url https://www.nowcoder.com/creation/manager/content/584337070?type=column&status=-1
 * @brief 
 *  (1)结点指针可能为NULL,不能用结点指针直接访问结点的数据域&指针域(head->val,head->next在head为空是都是非法访问)
        因此得先if()判断一下;
 *  (2)先将两个链表翻转,原来的'头'就是现在的'尾';  
 * @param head1 ListNode类 
 * @param head2 ListNode类 
 * @return ListNode类
 */
 struct ListNode* ReverseList(struct ListNode* pHead ) {
    // write code here
   
    struct ListNode* prev = NULL;
    struct ListNode* curr = pHead;
    struct ListNode* next;

    //退出循环后curr指向NULL
    while(curr != NULL)
    {
        next = curr->next;
        curr->next = prev;
        prev = curr;
        curr = next;
    }

    return prev;
}

struct ListNode* addInList(struct ListNode* head1, struct ListNode* head2 ) {
    // write code here
    struct ListNode* p = NULL;

    head1 = ReverseList(head1);
    head2 = ReverseList(head2);

    int cf = 0;
    int num1 = 0;
    int num2 = 0;
    
    while(head1 || head2)
    {
        num1 = (head1)?(head1->val):(0);
        num2 = (head2)?(head2->val):(0);

        struct ListNode* Node = (struct ListNode*)malloc(sizeof(struct ListNode));

        Node->val = ( num1 + num2 + cf )%10;
        Node->next = p;
        p = Node;
        cf = ( num1 + num2 + cf >= 10)?(1):(0);

        if(head1) head1 = head1->next;
        if(head2) head2 = head2->next;
    }

    return p;
}

Algorithm:

现将链表翻转(BM1写过),头成了"尾",尾就成了"头","头"对齐相加即可;