题目:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
思路:
模拟加法运算,每一位相加,不超过10不进位,当前位值和就是当前位的值p;超过10进位1,当前位和的个位是当前位的值,后一位相加时要加上进位1
eg:3+4=7,当前位值为7;7+8=15,当前为值为5,进位为1
代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* res=new ListNode;//建立一个新链表,用于储存结果
ListNode* cur=res;
ListNode *cur1=l1,*cur2=l2;
int carry=0;//进位值
while(cur1||cur2)//当前两个链表有一个不为空,开始遍历
{
int x=cur1?cur1->val:0;//取当前链表1的结点值
int y=cur2?cur2->val:0;//取当前链表2的结点值
int sum=x+y+carry;//当前链表1和2结点值的和,不要忘记进位值
carry=sum/10;
ListNode* node=new ListNode(sum%10);//在结果链表中插入结点
node->next=cur->next;
cur->next=node;
//cur->next=new ListNode(sum%10);//在结果链表中插入结点的另一种方法
cur=cur->next;//让结果链表后移一位
if(cur1)//l1链表不为空,l1链表后移一位
{
cur1=cur1->next;
}
if(cur2)//l2链表不为空,l2链表后移一位
{
cur2=cur2->next;
}
}
if(carry>0)//如果最后有进位,需要结果链表新增一个结点,用于储存进位1
{
cur->next=new ListNode(carry);
}
return res->next;
}
};
1.if else结构可以考虑使用条件操作符(?:),减少代码行数;
2.链表结点插入采用的是头插法,也可以采用注释中的另一种方法;
3.如果最后有进位,需要结果链表新增一个结点,用于储存进位1
例如5+5=10,如果不考虑最后的进位,输出结果会是0

本文介绍了一种算法,用于解决两个逆序存储的非负整数链表相加的问题。通过模拟加法运算,逐位相加并处理进位,最终返回表示和的新链表。代码示例展示了如何使用C++实现这一过程。
3016

被折叠的 条评论
为什么被折叠?



