【力扣一题】两数相加(C)

这段代码定义了一个函数addTwoNumbers,用于将两个单链表表示的数字相加。它使用了两个指针res和pre来构建新的结果链表,res始终指向链表头,pre则跟踪最后一个已添加的节点。在循环中,根据当前链表节点值和进位计算新节点值,并更新链表结构。最后返回结果链表的下一个节点,即不包含初始0值的头节点。
摘要由CSDN通过智能技术生成

 

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
    struct ListNode* res = (struct ListNode*)malloc(sizeof(struct ListNode));
    res->val = 0;
    res->next = NULL;
    struct ListNode* pre = res;
    int carry = 0;//首先定义一个指向结果链表头结点的指针res,以及一个指向上一个节点的指针pre。将进位值carry初始化为0。

    while(l1 || l2 || carry) //接下来进行循环,条件为l1或l2不为NULL,或者存在进位carry
    {
        struct ListNode* temp = (struct ListNode*)malloc(sizeof(struct ListNode));
        int n1 = l1 ? l1->val :0 ;
        int n2 = l2 ? l2->val :0 ;
        int sum = n1 + n2 + carry;
        //定义一个新节点temp,并将l1和l2节点的值相加,同时加上进位值carry,得出本次节点值的和sum。
        
        temp->val = sum % 10;
        temp->next =NULL;
        pre->next = temp; //将temp连接到pre节点后面,同时更新pre节点为temp。

        pre = pre->next;
        carry = sum / 10;
        l1 = l1 ? l1->next : NULL ;
        l2 = l2 ? l2->next : NULL ;
    }
    return res->next;
}

注释如上,么么!

注意了:

pre和res是两个指针变量,分别用于构建新的结果链表。具体说明如下:

res指针指向结果链表的头节点,其初始值为一个新创建的节点(通过malloc函数动态分配)。之后,我们根据每次相加的结果将新的节点接在pre节点后面,来实现结果链表的构建。可以将res看作是整个结果链表的“起点”。

pre指针用于存储上一个节点的位置,在循环中,我们在每次处理完当前节点之后,将该节点添加到结果链表的尾部(即接在pre节点后面)。因此,pre指针实际上指向的是结果链表中最后一个节点的位置(随着循环的进行而不断更新)。可以将pre看作是结果链表的“终点”。

需要注意的是,在循环中,pre指针的起始值与res指针是相等的,即它们最初都指向结果链表的头节点。

我的理解为,res是一个老大,老大是不变的,然后pre再通过struct ListNode* pre = res;后res作为老大的小弟给老大忙前忙后,帮助老大拼接身体,最后返回老大的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值