题目
输入输出示例
解题关键
- 头指针和尾指针的定义,头指针表示的是链表的地址(用于返回),尾指针随着结点的增加而移动
- 进位的定义 大于10时,要有进位,当前的位置保留的t的值是t%10(要的是余数)
- while循环的条件,首先肯定是l1和l2都不为空,还有一个重要的条件是进位t也不为空,就是当l1和l2都为空时,如果产生了进位(t/10),则循环还要继续执行
- 创造一个结点,然后让尾指针的next指向这个新创造的结点
伪代码
创建头节点和尾结点
定义进位值,初始化为0
while(循环条件){
如果l1不为空,l1的值加到t上,并指向l1的下一个结点
如果l2不为空,l2的值加到t上,并指向l2的下一个结点
新分配一个结点空间,让尾结点的next指向这个新分配的内存空间
对t取余
让新结点的数据域的值为t取余后的值
新结点的next域置为空
然后再更新尾指针,使尾指针指向这个新的结点
令t = t/10 得到进位的值,下一次循环后直接进行累加(个人觉得这个很关键)
}
最后返回的是头结点指向的下一个结点的地址
代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
struct ListNode* head =malloc(sizeof(struct ListNode));
struct ListNode* tail = head;
int t = 0;
//循环的条件是l1或l2或t非空就执行,如果l1和l2已经为空,但是有一个进位,也要继续执行
while(l1 || l2 || t){
if(l1){
t += l1->val;
l1 = l1->next;
};
if(l2){
t +=l2->val;
l2 = l2->next;
};
//新分配一个大小为ListNode的内存,然后让tail->next指向这个内存
tail->next = malloc(sizeof(struct ListNode));
// 取余数 因为只能存一个值
tail->next->val = t%10;
tail->next->next = NULL;
//指向一个新结点
tail = tail->next;
//取商 得到的是进位,下一次循环时直接累加
t = t/10;
};
return head->next;
}
最后
代码借鉴了力扣题解中的某个大佬