每日一题3:两数相加

leetcode刷题笔记新地址(仍在更新)

https://github.com/MyLinChi/LeetcodeNote

问题描述

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

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

问题分析

在计算机中实现两个数相加的方法是
S = A + B + C S = A + B + C S=A+B+C
S-和,A-被加数,B-被加数,C-进位
注意事项
1.初始时 C = 0 C=0 C=0
2.当其中一个链表的数加完时,计算的式子将变成 S = A + C S = A + C S=A+C(或 S = B + C S = B + C S=B+C)的形式,因此要对剩余的链表中的数据继续相加。
3.当所有的链表中的元素已经计算完毕,如果 C ! = 0 C!=0 C!=0,那么应该给结果链表多分配一个结点存储进位。
4.链表的输入采用头插法,根据计算过程和结果的形式,结果链表的生成采用尾插法;为了便于链表的操作,开始时给结果链表分配一个空结点,只需返回空结点指向的链表即可。

代码

#include<iostream>
#include<string>
using namespace std;

/**
* Definition for singly-linked list.
* struct ListNode {
*     int val;
*     ListNode *next;
*     ListNode(int x) : val(x), next(NULL) {}
* };
*/

struct ListNode {
	int val;
	ListNode *next;
	ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
	int c;
	Solution() :c(0){}
	ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
		ListNode * ans = new ListNode(0);//null node
		ListNode * tail = ans;
		while (l1&&l2)
		{
			int sum = l1->val + l2->val + c;
			c = sum / 10;
			tail->next = new ListNode(sum % 10);
			tail = tail->next;
			l1 = l1->next;
			l2 = l2->next;
		}
		if (l1){
			while (l1)
			{
				int sum = l1->val + c;
				c = sum / 10;
				tail->next = new ListNode(sum % 10);
				tail = tail->next;
				l1 = l1->next;
			}
		}else if (l2){
			while (l2)
			{
				int sum = l2->val + c;
				c = sum / 10;
				tail->next = new ListNode(sum % 10);
				tail = tail->next;
				l2 = l2->next;
			}
		}
		if (c){
			tail->next = new ListNode(c);
			tail = tail->next;
		}
		return ans->next;
	}
};

int main()
{
	ListNode * a = NULL, *b = NULL,*tp = NULL;
	char t;
	while (cin >> t){
		if ('#' == t)break;
		tp = a;
		a = new ListNode(t - '0');
		a->next = tp;
	}

	while (cin >> t){
		if ('#' == t)break;
		tp = b;
		b = new ListNode(t - '0');
		b->next = tp;
	}
	Solution s;
	ListNode * c;
	c = s.addTwoNumbers(a, b);
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值