两数相加——力扣(LeetCode)
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储一位数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
思路解析:
首先考虑到本题是对链表里的数据进行加法计算,故不能直接进行计算,所以我们需自己设计算法,由于本题只涉及加法,所以思路还是比较简单,对其进行除法和取模计算得到个位和十位上的数值,个位上的存储到链表中,十位上则定义一个整型变量进行存储。
这道题需要注意的是两个链表的长度不一定会想等,所以需要加入if语句判断一些特殊条件,还有一点要考虑的就是最后一位也就是计算最高位计算的时候。
接下来就又代码演示:
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
struct ListNode* head = NULL, *tail = NULL;
int carry = 0;
//用循环进行逐个计算
while(l1 || l2)//两个链表均为空为结束条件
{
//判断l1,l2是否为空,并针对不同的情况对n1,n2进行赋值
int n1 = l1 ? l1->val : 0;
int n2 = l2 ? l2->val : 0;
int sum = (n1 + n2 + carry) % 10;
if(!head)
{
head = tail = (struct ListNode*)malloc(sizeof(struct ListNode));
tail->val = sum;
tail->next = NULL;
}
else
{
tail->next = (struct ListNode*)malloc(sizeof(struct ListNode));
tail->next->val = sum;
tail = tail->next;
tail->next = NULL;
}
//用carry来存储进制的数值,并在下次循环即更高位的数值中加入计算
carry = (n1 + n2 + carry) / 10;
//根据情况判断指针是否移动
if(l1)
{
l1 = l1->next;
}
if(l2)
{
l2 = l2->next;
}
}
//如果最后一次计算carry不为0,说明有进制数值
if(carry)
{
tail->next = (struct ListNode*)malloc(sizeof(struct ListNode));
tail->next->val = carry;
tail = tail->next;
tail->next = NULL;
}
return head;
}