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 ...
随机推荐
- python把文件从一个目录复制到另外一个目录,并且备份
#!/usr/bin/python # -*- coding: utf-8 -*- import os,sys,md5,datetime,shutil,time,zipfile,chardet # c ...
- JS 浅谈函数柯里化,不明觉厉
在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术.这个技术由 Christopher ...
- 关于windows 下每次打开IE 8都弹出欢迎使用Internet Explorer 8 弹窗的关闭方法
今天笔者在安装完windows 操作系统后,发现了一个问题,即每次打开IE 8浏览器,都会弹出一个欢迎界面: 弹窗标题为:设置windows Internet Explorer,具体内容如下图所示: ...
- PHP中多维数组var_dump展示不全
转载于http://blog.csdn.net/Merlin_feng/article/details/51733354
- 【转】- 从FM推演各深度CTR预估模型(附代码)
从FM推演各深度CTR预估模型(附代码) 2018年07月13日 15:04:34 阅读数:584 作者: 龙心尘 && 寒小阳 时间:2018年7月 出处: 龙心尘 寒小阳
- ArcEngine临时数据存储 创建内存工作空间
参考网址,这里 工作中有时候需要使用临时数据,以前都是创建一个默认的shapefile或者gdb,今天发现esri官方帮助文档给出了一个方法,可以创建内存工作空间,代码如下: public stati ...
- 有关apk打包的东西最近正在整理
下周将会呈现给大家完整的一套打包流程. {‘敬请期待’,}
- linux考试题改错
符号链接和硬链接有什么区别? 改:符号链接存储文件路径,可以指向不同分区文件,源文件删除后失效. 改:硬链接指向文件索引节点,仅能指向同一分区文件,源文件删除后可以访问. 请描述文件和目录9位权限位的 ...
- Python中time模块详解(转)
在平常的代码中,我们常常需要与时间打交道.在Python中,与时间处理有关的模块就包括:time,datetime以及calendar.这篇文章,主要讲解time模块. 在开始之前,首先要说明这几点: ...
- 主席树 || 可持久化线段树 || LCA || BZOJ 2588: Spoj 10628. Count on a tree || Luogu P2633 Count on a tree
题面: Count on a tree 题解: 主席树维护每个节点到根节点的权值出现次数,大体和主席树典型做法差不多,对于询问(X,Y),答案要计算ans(X)+ans(Y)-ans(LCA(X,Y) ...