/**
* 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作为老大的小弟给老大忙前忙后,帮助老大拼接身体,最后返回老大的值。