C++LeetCode每日一题 - 2. 两数相加

题目:2.两数相加

Description

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

Sample

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

Solution

首先将两条链表合并成一条链表,再进行进位运算,使得链表每个节点只能存储一位数字。

具体操作:双指针,各一个指针指向每条链表的头节点,如果都不为空,将第二条链表的节点的值加到第一条节点的值上,在一起往后移动。如果出现指向空,直接将上次的指针指向不为空的,结束遍历。如果都为空,直接结束遍历。
这样就将两条链表合并成了一条链表。
然后遍历得到的链表,若当前节点的值大于等于10,就会产生进位,那么下个节点的值加1。直到最后一个节点,若最后一个节点的值大于等于10,就要创建一个新的节点,赋值为1。至此,完成进位运算。
返回最初的头节点即可!

AC Code
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode * h1=l1;
        ListNode * h2=l2;
        ListNode * pos=NULL;
        ListNode * t;
        while(h1||h2){//合并链表
            if(h1&&h2){
                h1->val+=h2->val;
                if(pos==NULL) pos=h1;
                else {
                    pos->next=h1;
                    pos=pos->next;
                }
            }
            else {
               if(h1==NULL&&h2){
                    pos->next = h2;
                    pos=pos->next;
                } 
                if(h2==NULL&&h1){
                    pos->next = h1;
                    pos=pos->next;
                }
                break; 
            }
            if(h1) h1=h1->next;
            if(h2) h2=h2->next;
        }
        h1=l1;
        int num=0;//记录进位
        while(h1){
            h1->val+=num;
            if(h1->val>=10){
                num=1;
                h1->val%=10;
            }
            else num=0;
            if(h1->next==NULL&&num){//考虑最后一个节点可进位
                t=new ListNode(1);
                num=0;
                h1->next=t;
            }
            h1=h1->next;
        }
        return l1;
    }
};

PS:希望对你有帮助!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值