个人认为,该题目可以看作合并两个链表的变种题,本题与21题不同的是,再处理两个结点时,对比的不是两者的大小,而是两者和是否大于10,加法计算中大于10要进位,所以我们需要声明一个用来标记是否进位的值。
解题思路:
1、直接从链表头部开始相加就是从数字的最低位开始相加。
2、同时遍历两个链表,将对应位置的数字相加,并考虑前一位的进位。
3、每次相加后,可能会有进位(即和大于等于10),需要将进位加到下一位的计算中。
4、如果两个链表长度不同,较短的链表在后续遍历中可以视为 0
。
5、如果遍历完所有节点后仍有进位,需要额外创建一个节点来存储这个进位。
代码:
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2)
{struct ListNode* l3=malloc(sizeof(struct ListNode));struct ListNode* head=l3;int carry=0;
//两个链表不为空或有进位时,进行计算while(l1!=NULL||l2!=NULL||carry!=0){// 初始化和为当前进位int sum=carry;if(l1!=NULL){
// 如果 l1 不为空,累加 l1 的当前值,并移动 l1 到下一个节点sum+=l1->val;l1=l1->next;}if(l2!=NULL){// 如果 l2 不为空,累加 l2 的当前值,并移动 l2 到下一个节点sum+=l2->val;l2=l2->next;}//进位的数字计算carry=sum/10;sum%=10;
//在结果链表创建新结点,存储suml3->next=malloc(sizeof(struct ListNode));l3=l3->next;l3->val=sum;l3->next=NULL;}
// 返回结果链表的头节点(跳过虚拟头节点)return head->next;
}