Leetcode 2 - Add Two Numbers(链表求和)

23 篇文章 0 订阅

题意

给定两个链表,代表数字的相反次序,求这两个链表加起来的和。用链表存储结果。

思路

算法1

在原来的位置上存储,利用原来的空间,于是需要判断一下哪个链表先到终点等。

算法2

很简洁的一个写法,我们假设链表的长度相同,如果一个为空了我们认为是0。

并且,在处理头结点的时候,我们刚开始新建一个不用的头结点p,每次求和的值保存在p->next = new ListNode(val)

最后结果将p后移一位即可。

代码

algorithm 1

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* add(ListNode *l1, ListNode *l2) {
        ListNode *p = l1, *q = l2, *pre1 = p, *pre2 = q;
        int adc = 0;
        while (p && q) {
            p->val += (q->val + adc);
            if (p->val >= 10) {
                p->val %= 10;
                adc = 1;
            } else {
                adc = 0;
            }
            pre1 = p; pre2 = q;
            p = p->next;
            q = q->next;
        }
        if (p && !q) {
            while (p && adc) {
                p->val += adc;
                if (p->val >= 10) {
                    p->val %= 10;
                    adc = 1;
                } else {
                    adc = 0;
                }
                pre1 = p;
                p = p->next;
            }
        } else if (!p && q) {
            while (q) {
                q->val += adc;
                if (q->val >= 10) {
                    q->val %= 10;
                    adc = 1;
                } else {
                    adc = 0;
                }
                pre1->next = q;
                pre1 = pre1->next;
                q = q->next;
            }
        }
        if (adc) pre1->next = new ListNode(adc);
        return l1;
    }

    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        return add(l1, l2);
    }
};

algorithm 2

/**
 * 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) {
        int adc = 0;
        ListNode *head = new ListNode(0), *p = head;
        while (l1 || l2 || adc) {
            int sum = (l1 ? l1->val : 0) + (l2 ? l2->val : 0) + adc;
            adc = sum / 10;
            p->next = new ListNode(sum % 10);
            p = p->next;
            l1 = l1 ? l1->next : l1;
            l2 = l2 ? l2->next : l2;
        }
        return head->next;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值