2 两数相加

题目描述:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 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;
    }
};

你可能感兴趣的:(LeetCode)