LeetCode #002# Add Two Numbers(js描述)
问题描述:https://leetcode.com/problems/add-two-numbers/
思路1:基本加法规则
根据小学学的基本加法规则。。。。。我们需要将两个数以最低位为基准对齐,然后逐个加,需要进位的给进位就行了。。。。恰好这个链表是逆序的!!!已经为我们对齐了。用两个指针分别指向两个链表头,开始同步往后移动,边移动边计算结果,直到两个指针都到了尽头/没有进位。时间复杂度是O(max(m, n)),空间复杂度和时间复杂度一样。js代码如下:
// Runtime: 116 ms
var addTwoNumbers = function(l1, l2) {
let dummy = { next: null }, // 结果链表的head指针
tail = dummy, // tail总是指向dummy的末尾元素,以便在链表尾插入新元素
flag = false, // flag标示是否需要进位
sum; let init = () => { // 初始化,因为保证非空,所以首位总是存在的(可能为0)
sum = l1.val + l2.val;
tail.next = new ListNode(sum % 10);
// 为下一位的计算做准备
flag = sum >= 10;
l1 = l1.next;
l2 = l2.next;
// 保持tail性质不变
tail = tail.next;
}; let work = () => {
let v1, v2;
while (l1 || l2 || flag) {
// 统一化处理,不用判断谁空谁不空
v1 = l1 ? l1.val : 0;
v2 = l2 ? l2.val : 0;
sum = v1 + v2 + (flag ? 1 : 0);
tail.next = new ListNode(sum % 10);
// 为下一位的计算做准备
flag = sum >= 10;
l1 = l1 ? l1.next : null;
l2 = l2 ? l2.next : null;
// 保持tail性质不变
tail = tail.next;
}
}; init();
work(); return dummy.next;
};
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
struct ListNode *l3 = malloc(sizeof(struct ListNode));
struct ListNode *tail = l3; int sum = l1->val + l2->val;
tail->val = sum % ;
int flag = sum >= ;
l1 = l1->next;
l2 = l2->next; int v1, v2;
while (l1 || l2 || flag) {
v1 = l1 ? l1->val : ;
v2 = l2 ? l2->val : ;
sum = v1 + v2 + (flag ? : ); tail->next = malloc(sizeof(struct ListNode));
tail = tail->next;
tail->val = sum % ; flag = sum >= ;
l1 = l1 ? l1->next : NULL;
l2 = l2 ? l2->next : NULL;
} tail->next = NULL; // 这句话是必要的!否则提交后会有运行时错误。
return l3;
}
C语言版本
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode ans = new ListNode(0), tail = ans;
boolean flag = false; // 当前位是否需要进位
// 保持一个循环不变式:
// ans的前面n位为l1与l2前n位相加的正确结果
// l1与l2要么为空要么指向当前/即将计算位 // 初始化
int sum = l1.val + l2.val + (flag ? 1 : 0);
tail.val = sum % 10; flag = sum >= 10;
l1 = l1.next;
l2 = l2.next; // 保持
int v1, v2; // l1.val与l2.val不能再直接用,可能为空
while (flag || l1 != null || l2 != null) {
if (l1 == null) {
v1 = 0;
} else {
v1 = l1.val;
l1 = l1.next;
} if (l2 == null) {
v2 = 0;
} else {
v2 = l2.val;
l2 = l2.next;
} sum = v1 + v2 + (flag ? 1 : 0);
tail.next = new ListNode(sum % 10); flag = sum >= 10;
tail = tail.next;
} // 终止 return ans;
}
}
Java版本
思路2:移花接木法。。。
基本上和思路1没区别,并不能改善时间复杂度的渐进性,只是省了点空间。js代码:
// 不创建新链表,直接把结果存到l1上,并对多出来的部分做"嫁接"处理
// Runtime: 112 ms, faster than 99.52% of JavaScript online submissions for Add Two Numbers.
var addTwoNumbers2 = function(l1, l2) {
let dummy = { next: l1 }, // 结果链表的head指针
tail = dummy, // tail总是指向l1的前继元素(也就是dummy的尾元素),以便在链尾插入链表/新元素
flag = false, // flag标示下一位的计算是否需要进位
sum; let init = () => { // 初始化,因为保证非空,所以首位总是存在的
sum = l1.val + l2.val;
l1.val = sum % 10;
// 为下一位的计算做准备
flag = sum >= 10;
l1 = l1.next;
l2 = l2.next;
// 保持tail性质不变
tail = tail.next;
}; let status1 = () => { // 处理等长的那部分
while (l1 && l2) {
sum = l1.val + l2.val + (flag ? 1 : 0);
l1.val = sum % 10;
// 为下一位的计算做准备
flag = sum >= 10;
l1 = l1.next;
l2 = l2.next;
// 保持tail性质不变
tail = tail.next;
}
}; let status2 = () => { // 处理多出来的部分
// 如果l2更长,直接移植到l1
if (l2) {
l1 = tail.next = l2;
}
// 处理进位
while (l1 && flag) {
sum = l1.val + 1;
l1.val = sum % 10;
// 为下一位的计算做准备
flag = sum >= 10;
l1 = l1.next;
// 保持tail性质不变
tail = tail.next;
}
if (flag) {
tail.next = new ListNode(1);
}
}; init();
status1();
status2(); return dummy.next;
};
LeetCode #002# Add Two Numbers(js描述)的更多相关文章
- 【JAVA、C++】LeetCode 002 Add Two Numbers
You are given two linked lists representing two non-negative numbers. The digits are stored in rever ...
- [Leetcode] 002. Add Two Numbers
https://leetcode.com/problems/add-two-numbers/ public class Solution { public ListNode addTwoNumbers ...
- LeetCode:1. Add Two Numbers
题目: LeetCode:1. Add Two Numbers 描述: Given an array of integers, return indices of the two numbers su ...
- LeetCode(2) || Add Two Numbers && Longest Substring Without Repeating Characters
LeetCode(2) || Add Two Numbers && Longest Substring Without Repeating Characters 题记 刷LeetCod ...
- [LeetCode] 445. Add Two Numbers II 两个数字相加之二
You are given two linked lists representing two non-negative numbers. The most significant digit com ...
- [Leetcode Week15] Add Two Numbers
Add Two Numbers 题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/add-two-numbers/description/ Descrip ...
- LeetCode 面试:Add Two Numbers
1 题目 You are given two linked lists representing two non-negative numbers. The digits are stored in ...
- [LeetCode] 2. Add Two Numbers 两个数字相加 java语言实现 C++语言实现
[LeetCode] Add Two Numbers 两个数字相加 You are given two non-empty linked lists representing two non-ne ...
- [LeetCode] 2. Add Two Numbers 两个数字相加
You are given two non-empty linked lists representing two non-negative integers. The digits are stor ...
随机推荐
- dir 命令手册
dir 命令手册 参数 /A D 目录 R 只读文件 H 隐藏文件 A 准备存档的文件 S 系统文件 - 表示"否"的前缀 /B 使用空格式(没有标题信息或摘要) /C 在文件大小 ...
- LeetCode - 769. Max Chunks To Make Sorted
Given an array arr that is a permutation of [0, 1, ..., arr.length - 1], we split the array into som ...
- div左右居中css
l_btn{ font-size: 1.2rem; width: 190px; height: 50px; border: 1px solid #fff; border-radius: 25px; c ...
- mysql sql注入getshell新姿势
sql.php?sql=1'报错信息为:1064:You have an error in your SQL syntax; check the manual that corresponds to ...
- CF1B Spreadsheets
题意翻译 人们常用的电子表格软件(比如: Excel)采用如下所述的坐标系统: 第一列被标为A,第二列为B,以此类推,第26列为Z.接下来为由两个字母构成的列号: 第27列为AA,第28列为AB... ...
- Linux在终端命令行模式下智能补全功能以及组合键
linux命令行下也有很多热键(快捷键).先来看看tab键 1.如果想看看linux下以c开头的命令可直接在命令行下敲入c然后连续敲两次tab,再选择y,会显示所有以c开头的命令. 2.涉及到文件时, ...
- Java 实现 AES 加解密
毕业课题中需要使用加解密算法,要求加解密前后的数据长度不会变化,查了一些资料,发现可以采用AES加密的CFB跟OFB模式是无填充的模式,可以保持加解密前后数据的长度相等.下面上代码: import j ...
- jQuery 中的 39 个技巧【申明:来源于网络】
jQuery 中的 39 个技巧[申明:来源于网络] 地址:http://blog.csdn.net/zhongqi2513/article/details/53704812?ref=myread
- AARRR 量化感染率
小结: 1. 用户生命周期 2. K因子量化了感染的概率,即一个已经感染了病毒的宿主所能接触到的所有宿主中,会有多少宿主被其传染上病毒. 假设平均每个用户会向20个朋友发出邀请,而平均的转化率为10% ...
- Linux是cat、tail、head查看文件任意几行的数据
Linux是cat.tail.head查看文件任意几行的数据 一.使用cat.tail.head组合 1.查看最后100行的数据 cat filename | tail -n 100 2.查看100到 ...