lintcode add-two-numbers 链表求和

本文介绍了一种使用链表表示整数的方法,并实现了一个函数来计算两个链表所表示的整数之和。通过迭代处理链表节点并进行进位运算,最终返回表示和的新链表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

你有两个用链表代表的整数,其中每个节点包含一个数字。数字存储按照在原来整数中相反的顺序,使得第一个数字位于链表的开头。写出一个函数将两个整数相加,用链表形式返回和。
样例
给出两个链表 3->1->5->null 和 5->9->2->null,返回 8->0->8->null

笔记

在代码2中,要注意的时判断l1和l2是否到了尽头。

            if (l1 != NULL)
                l1 = l1->next;
            if (l2 != NULL)
                l2 = l2->next;

代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    /**
     * @param l1: the first list
     * @param l2: the second list
     * @return: the sum list of l1 and l2 
     */
    ListNode *addLists(ListNode *l1, ListNode *l2) {
        // write your code here
        int carry = 0;
        ListNode *pre = new ListNode(0);
        ListNode *tmp = pre;
        while (l1 != NULL && l2 != NULL)
        {
            int num = l1->val + l2->val + carry;
            l1 = l1->next;
            l2 = l2->next;
            tmp -> next = new ListNode(num % 10);
            tmp = tmp -> next;
            carry = num / 10;
        }
        while (l1 != NULL)
        {
            int num = l1->val + carry;
            l1 = l1->next;
            tmp -> next = new ListNode(num % 10);
            tmp = tmp -> next;
            carry = num / 10;
        }
        while (l2 != NULL)
        {
            int num = l2->val + carry;
            l2 = l2->next;
            tmp -> next = new ListNode(num % 10);
            tmp = tmp -> next;
            carry = num / 10;
        }
        if (carry == 1)
        {
            tmp->next = new ListNode(1);
            tmp = tmp->next;
        }
        tmp->next = NULL;
        return pre->next;
    }
};

第二次写。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    /**
     * @param l1: the first list
     * @param l2: the second list
     * @return: the sum list of l1 and l2 
     */
    ListNode *addLists(ListNode *l1, ListNode *l2) {
        // write your code here
        ListNode *beforeHead = new ListNode(0);
        ListNode *pre = beforeHead;
        int carry = 0;
        while (l1 !=  NULL || l2 != NULL)
        {
            int v1 = (l1 == NULL) ? 0 : l1->val;
            int v2 = (l2 == NULL) ? 0 : l2->val;
            int tmp = v1 + v2 + carry;
            ListNode *now = new ListNode(tmp%10);
            carry = tmp / 10;
            pre->next = now;
            pre = now;
            if (l1 != NULL)
                l1 = l1->next;
            if (l2 != NULL)
                l2 = l2->next;
        }
        if (carry)
        {
            ListNode *now = new ListNode(1);
            pre->next = now;
            pre = now;
        }
        pre->next = NULL;
        return beforeHead->next;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值