leetcode 2 -- Add Two Numbers

leetcode 2 – Add Two Numbers

题目:
You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8


题意:
两个链表,每个节点存有一个非负值且是为0-9,把两个链表相加且包含进位,看上面Input的4和6节点对应,4+6=10,所以1进位到下一个节点,当前节点和为10的余数0,最终返回求和后的一个链表。简单的说这个题类似巨大数的加法,用链表实现。


思路:
我的想法是借助其中一个链表作为返回即可,加另外一个链表对应的值,并没有新创建一个求和链表,比较节省空间,需要注意的点就是 1.你不确定哪个链表长。2.可能有循环进位情况,比如[9,9,9,9]和[1],结果为[0,0,0,0,1]。3.需要注意最后一个节点是否还有进位情况,有的话需要new一个新节点。


代码:

/**
 * 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) { 
        //p和q记录末尾节点
        ListNode *head = NULL, *p, *q;
        ListNode *head1 = l1, *head2 = l2;
        int t;
        //bef记录进位的值,初始化为0
        int bef = 0;
        //任何一个链表到达末尾就停止循环
        while(l1 != NULL && l2 != NULL){
            t = l1->val + l2->val + bef;
            //如果和大于等于10,进位值为1,否则为0
            if(t >= 10){
                l1->val = t%10;
                bef = 1;
            }else{
                l1->val = t;
                bef = 0;
            }
            //标记短链表到达末尾时的节点和此刻长链表所到达的节点
            p = l1;
            q = l2;
            l1 = l1->next;
            l2 = l2->next;
        }
        head = head1;
        /*我默认是l1为返回链表,所以如果l1比l2短,只需要l1末尾
        节点的next指针域指向l2比l1长的部分即可*/
        //长度一样的情况
        if(l1 == NULL && l2 == NULL){
            if(bef == 1){
                p->next = new ListNode(bef);
            }   
        }else if(l1 == NULL || l2 == NULL){
            //如果l1短接上l2的余下部分
            if(l1 == NULL)
                p->next = q->next;
            //看是否余下的单链表出现循环进位的情况
            while(p->next != NULL){
                p->next->val += bef; 
                if(p->next->val >= 10){
                    p->next->val %= 10;
                    p = p->next;
                    bef = 1;
                }else{
                    bef = 0;
                    break;
                }
            }
            //最后一个节点若出现进位还需new一个新节点
            if(bef == 1){
                p->next = new ListNode(1);
            }
        }
        return head;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏天的技术博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值