题目描述:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
方法1:
主要思路:
(1)直接将从头开始相加两个链表中的值,另外加一个用于存储进位的结果的变量;
(2)直到将两个链表共同长度的部分处理结束,再单独处理没有遍历完的链表;
(3)最后根据进位的结果,判断是否需要在链表的结尾添加结点;
/**
* 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* dummy=new ListNode(0);//辅助结点
ListNode* newHead=dummy;
int higher=0;//存储进位结果
int tmp=0;//存储两个位相加和
//遍历两个链表相同长度的部分
while(l1&&l2){
tmp=l1->val+l2->val+higher;
if(tmp>9){//若是和需要进位
higher=1;
tmp-=10;
}
else{//若是不需要进位,则重新将进位结果置为0
higher=0;
}
//新建立结点
newHead->next=new ListNode(tmp);
//更新三个链表的位置
newHead=newHead->next;
l1=l1->next;
l2=l2->next;
}
//找出可能的没有遍历完的链表,既较长的链表的没有遍历的部分
ListNode* list=NULL;
if(l1){
list=l1;
}
else if(l2){
list=l2;
}
//处理没有遍历结束的链表
while(list){
tmp=list->val+higher;
if(tmp>9){
higher=1;
tmp-=10;
}
else{
higher=0;
}
newHead->next=new ListNode(tmp);
newHead=newHead->next;
list=list->next;
}
//处理是否可能进位的情形
if(higher==1)
newHead->next=new ListNode(1);
newHead=dummy->next;//释放辅助内存
delete dummy;
return newHead;
}
};