LeetCode (2):两数相加

栏目: IT技术 · 发布时间: 5年前

内容简介:LeetCode 相关的文章:

LeetCode 相关的文章:

1、 LeetCode | 1.两数之和

2、 LeetCode | 703.数据流中的第K大元素

3、 LeetCode | 232.用栈实现队列

4、LeetCode | 225.用队列实现栈

5、LeetCode | 20.有效的括号

6、 LeetCode | 141.环形链表

7、 LeetCode | 24.两两交换链表中的节点

8 LeetCode | 206.反转链表

这次来写一下 LeetCode 的第 2 题,两数相加。

题目描述

题目直接从 LeetCode 上截图过来,题目如下:

LeetCode (2):两数相加

上面的题就是 两数相加 题目的截图,同时 LeetCode 会根据选择的语言给出了一个类的定义或者函数的定义,然后在其中实现 两数相加 的解题过程。这次我使用 C 语言来进行完成。

C 语言给出的函数定义如下:

/**

* Definition for singly-linked list.

* struct ListNode {

* int val;

* struct ListNode *next;

* };

*/

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){

}

通过函数定义可以看出,addTwoNumbers 函数的参数是两个单向链表,然后返回值也是一个链表,然后我们要做的就是让两个链表的每个节点相加,并产生新的节点构成一个新的链表,并且链表上的每个节点只能存储一位数。

问题分析

初看题目,可能觉得并不复杂,事实上也的确不是很复杂。两个链表的每个节点相加,然后所得的结果存在一个新的链表节点当中,且这个节点中只能存一位数。

其实,这样的思路是比较符合我们做加法思路的,在我们列竖式的时候,就是按照这种方式来进行计算的。这里用图来进行描述。

LeetCode (2):两数相加

只要使链表的指针逐步的移动,并使指针所指向的节点中的值进行相加,相加后判断是否产生进位,如果产生进位则记录下进位的值,把进位后剩下的个位数写入链表的节点,进位的值与当前节点的下对节点相加时同时参与运算即可。

链表最后的一对节点相加后也可能会产生进位,因此在循环相加后,需要判断是否产生了进位,如果有进位需要为这个进位一个单独的节点链到链表的结尾处。

当一个链表比另外一个链表长的时候,只要让较长的那个链表和 0 相加即可。直到两个链表都为空为止。

代码实现

C 语言的代码如下

/**

* Definition for singly-linked list.

* struct ListNode {

* int val;

* struct ListNode *next;

* };

*/

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){

if (l1 == NULL) {

return l2;

}


if (l2 == NULL) {

return l1;

}


struct ListNode* one = l1;

struct ListNode* two = l2;

struct ListNode* sum = NULL;

struct ListNode* tsum = NULL;

/* 进位值 */

int tmp = 0;


struct ListNode* tn = NULL;

while (one != NULL || two != NULL) {

int o = 0, t = 0, s = 0;

if (one != NULL) {

o = one->val;

one = one->next;

}

if (two != NULL) {

t = two->val;

two = two->next;

}


/* 带进位加法 */

s = o + t + tmp;

tmp = s / 10;

s = s % 10;


tn = (struct ListNode*)malloc(sizeof(struct ListNode));

tn->val = s;

tn->next = NULL;


if (sum != NULL) {

tsum->next = tn;

tsum = tn;

} else {

sum = tn;

tsum = tn;

}

}


if (tmp != 0) {

tn = (struct ListNode*)malloc(sizeof(struct ListNode));

tn->val = tmp;

tn->next = NULL;

tsum->next = tn;

}


return sum;

}

提交结果

在写完代码后,点击右下角的 “ 执行代码 ”,然后观察  “输出” 和 “预期结果”  是否一致,一致的话就点击 “ 提交 ” 按钮。点击 “提交” 按钮后,系统会使用更多的测试用例来测试我们写的函数体, 如果所有的测试用例都通过了,那么就会给出 “通过” 的字样, 如果没有通过,会给出失败的那一组测试用例,我们可以根据给出的测试用例来继续修改代码 。我们的代码提交后的截图如下:

LeetCode (2):两数相加

LeetCode (2):两数相加

喜欢就点在看哦~


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

C++程序设计原理与实践

C++程序设计原理与实践

(美)Bjarne Stroustrup / 王刚 等 / 机械工业出版社 / 2010.7 / 108.00元

本书是经典程序设计思想与C++开发实践的完美结合,是C++之父回归校园后对C++编程原理和技巧的全新阐述。书中全面地介绍了程序设计基本原理,包括基本概念、设计和编程技术、语言特性以及标准库等,教你学会如何编写具有输入、输出、计算以及简单图形显示等功能的程序。此外,本书通过对C++思想和历史的讨论、对经典实例(如矩阵运算、文本处理、测试以及嵌入式系统程序设计)的展示,以及对C语言的简单描述,为你呈现......一起来看看 《C++程序设计原理与实践》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

SHA 加密
SHA 加密

SHA 加密工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具