algorithm-base/animation-simulation/链表篇/面试题 02.05. 链表求和.md

270 lines
10 KiB
Java
Raw Normal View History

2021-07-23 15:44:19 +00:00
> **[tan45du_one](https://raw.githubusercontent.com/tan45du/tan45du.github.io/master/个人微信.15egrcgqd94w.jpg)** ,备注 github + 题目 + 问题 向我反馈
2021-03-20 08:57:12 +00:00
>
>
>
2021-07-23 15:44:19 +00:00
> <u>[****](https://raw.githubusercontent.com/tan45du/test/master/微信图片_20210320152235.2pthdebvh1c0.png)</u> 两个平台同步,想要和题友一起刷题,互相监督的同学,可以在我的小屋点击<u>[**刷题小队**](https://raw.githubusercontent.com/tan45du/test/master/微信图片_20210320152235.2pthdebvh1c0.png)</u>进入。
2021-03-20 08:57:12 +00:00
#### [ 02.05. ](https://leetcode-cn.com/problems/sum-lists-lcci/)
2021-03-19 07:07:33 +00:00
2021-07-23 15:44:19 +00:00
k
2021-03-19 07:07:33 +00:00
西
>
2021-07-23 15:44:19 +00:00
2021-03-19 07:07:33 +00:00
2021-07-23 15:44:19 +00:00
1
2021-03-19 07:07:33 +00:00
```java
2021-07-15 16:06:52 +00:00
(7 -> 1 -> 6) + (5 -> 9 -> 2) 617 + 295
2 -> 1 -> 9 912
2021-03-19 07:07:33 +00:00
```
2021-07-23 15:44:19 +00:00
2
2021-03-19 07:07:33 +00:00
```java
2021-07-15 16:06:52 +00:00
(9 -> 9) + (9 -> 9) 99 + 99
8 -> 9 -> 1
2021-03-19 07:07:33 +00:00
```
2021-07-23 15:44:19 +00:00
3
2021-03-19 07:07:33 +00:00
```java
2021-07-15 16:06:52 +00:00
(5) + (5) 5 + 5
0 -> 1
2021-03-19 07:07:33 +00:00
```
****
java int -2147483648 +2147483648 -2^31 2^31
2021-07-23 15:44:19 +00:00
10 10 1
2021-03-19 07:07:33 +00:00
2021-07-13 05:08:47 +00:00
1.
2021-03-19 07:07:33 +00:00
2021-07-13 05:08:47 +00:00
2.
2021-03-19 07:07:33 +00:00
2021-07-23 15:44:19 +00:00
3. 1
2021-03-19 07:07:33 +00:00
2021-07-23 15:44:19 +00:00
0 1 99+9=18
2021-03-19 07:07:33 +00:00
![](https://cdn.jsdelivr.net/gh/tan45du/photobed@master/photo/链表求和.1yh4ymdee3k0.gif)
2021-07-23 15:44:19 +00:00
nlist 1 summod 1
2021-04-28 10:28:00 +00:00
****
Java Code:
2021-03-19 07:07:33 +00:00
```java
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
2021-07-13 05:08:47 +00:00
//待会儿要返回的链表
2021-07-15 16:06:52 +00:00
ListNode nList = new ListNode(-1);//哑节点
2021-03-19 07:07:33 +00:00
ListNode tempnode = nList;
//用来保存进位值初始化为0
int summod = 0;
while(l1 != null || l2 != null) {
//如果l1的链表为空则l1num为0若是不为空则为链表的节点值
//判断是否为空为空就设为0
int l1num = l1 == null ? 0 : l1.val;
int l2num = l2 == null ? 0 : l2.val;
//将链表的值和进位值相加,得到为返回链表的值
int sum = l1num+l2num+summod;
//更新进位值例18/10=19/10=0
summod = sum/10;
2021-07-15 16:06:52 +00:00
//新节点保存的值18%8=2则添加2
2021-07-23 15:44:19 +00:00
sum = sum%10;
2021-03-19 07:07:33 +00:00
//添加节点
tempnode.next = new ListNode(sum);
//移动指针
tempnode = tempnode.next;
if (l1 != null) {
l1 = l1.next;
}
if (l2 != null) {
l2 = l2.next;
2021-07-23 15:44:19 +00:00
}
2021-03-19 07:07:33 +00:00
}
//最后根据进位值判断需不需要继续添加节点
2021-07-13 05:08:47 +00:00
if (summod != 0) {
2021-03-19 07:07:33 +00:00
tempnode.next = new ListNode(summod);
}
2021-07-15 16:06:52 +00:00
return nList.next;//去除哑节点
2021-03-19 07:07:33 +00:00
}
}
```
2021-04-28 10:28:00 +00:00
C++ Code:
```cpp
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
2021-07-13 05:08:47 +00:00
//待会儿要返回的链表
2021-07-15 16:06:52 +00:00
ListNode * nList = new ListNode(-1);//哑节点
2021-04-28 10:28:00 +00:00
ListNode * tempnode = nList;
//用来保存进位值初始化为0
int summod = 0;
while(l1 != nullptr || l2 != nullptr) {
//如果l1的链表为空则l1num为0若是不为空则为链表的节点值
//判断是否为空为空就设为0
int l1num = l1 == nullptr ? 0 : l1->val;
int l2num = l2 == nullptr ? 0 : l2->val;
//将链表的值和进位值相加,得到为返回链表的值
int sum = l1num + l2num + summod;
//更新进位值例18/10=19/10=0
summod = sum / 10;
2021-07-15 16:06:52 +00:00
//新节点保存的值18%8=2则添加2
2021-07-23 15:44:19 +00:00
sum = sum % 10;
2021-04-28 10:28:00 +00:00
//添加节点
tempnode->next = new ListNode(sum);
//移动指针
tempnode = tempnode->next;
if (l1 != nullptr) {
l1 = l1->next;
}
if (l2 != nullptr) {
l2 = l2->next;
2021-07-23 15:44:19 +00:00
}
2021-04-28 10:28:00 +00:00
}
//最后根据进位值判断需不需要继续添加节点
2021-07-13 05:08:47 +00:00
if (summod != 0) {
2021-04-28 10:28:00 +00:00
tempnode->next = new ListNode(summod);
}
2021-07-15 16:06:52 +00:00
return nList->next;//哑节点
2021-04-28 10:28:00 +00:00
}
};
```
2021-07-13 05:08:47 +00:00
JS Code:
```js
2021-07-23 15:44:19 +00:00
var addTwoNumbers = function (l1, l2) {
//待会儿要返回的链表
let nList = new ListNode(-1); //哑节点
let tempnode = nList;
//用来保存进位值初始化为0
let summod = 0;
while (l1 || l2) {
//如果l1的链表为空则l1num为0若是不为空则为链表的节点值
//判断是否为空为空就设为0
let l1num = l1 === null ? 0 : l1.val;
let l2num = l2 === null ? 0 : l2.val;
//将链表的值和进位值相加,得到为返回链表的值
let sum = l1num + l2num + summod;
//更新进位值例18/10=19/10=0
summod = ~~(sum / 10);
//新节点保存的值18%8=2则添加2
sum = sum % 10;
//添加节点
tempnode.next = new ListNode(sum);
//移动指针
tempnode = tempnode.next;
if (l1) {
l1 = l1.next;
2021-07-13 05:08:47 +00:00
}
2021-07-23 15:44:19 +00:00
if (l2) {
l2 = l2.next;
2021-07-13 05:08:47 +00:00
}
2021-07-23 15:44:19 +00:00
}
//最后根据进位值判断需不需要继续添加节点
if (summod !== 0) {
tempnode.next = new ListNode(summod);
}
return nList.next; //去除哑节点
2021-07-13 05:08:47 +00:00
};
```
Python Code:
2021-07-15 16:06:52 +00:00
```python
2021-07-13 05:08:47 +00:00
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
#
2021-07-15 16:06:52 +00:00
nList = ListNode(-1) #
2021-07-13 05:08:47 +00:00
tempnode = nList
# 0
summod = 0
2021-07-15 16:06:52 +00:00
while l1 is not None o l2 is not None:
2021-07-13 05:08:47 +00:00
# l1l1num0
# 0
l1num = 0 if l1 is None else l1.val
l2num = 0 if l2 is None else l2.val
#
sum_ = l1num + l2num + summod
# 18/10=19/10=0
# 1 %8=22
# 使divmod
summod, sum_ = divmod(sum_, 10)
#
tempnode.next = ListNode(sum_)
#
tempnode = tempnode.next
if l1 is not None:
l1 = l1.next
if l2 is not None:
l2 = l2.next
#
if summod != 0:
tempnode.next = ListNode(summod)
2021-07-15 16:06:52 +00:00
return nList.next #
2021-07-13 05:08:47 +00:00
```
2021-07-17 14:28:06 +00:00
Swift Code
```swift
class Solution {
func addTwoNumbers(_ l1: ListNode?, _ l2: ListNode?) -> ListNode? {
var l1 = l1, l2 = l2
var nList = ListNode(-1) // 哑节点
var tempnode = nList
// 用来保存进位值初始化为0
2021-07-23 15:44:19 +00:00
var summod = 0
2021-07-17 14:28:06 +00:00
while l1 != nil || l2 != nil {
// 链表的节点值
2021-07-23 15:44:19 +00:00
let l1num = l1?.val ?? 0
let l2num = l2?.val ?? 0
2021-07-17 14:28:06 +00:00
// 将链表的值和进位值相加,得到为返回链表的值
var sum = l1num + l2num + summod
// 更新进位值例18/10=19/10=0
summod = sum / 10
// 新节点保存的值18%8=2则添加2
sum = sum % 10
// 添加节点
tempnode.next = ListNode(sum)
// 移动指针
tempnode = tempnode.next!
if l1 != nil {
l1 = l1?.next
}
if l2 != nil {
l2 = l2?.next
}
}
// 最后根据进位值判断需不需要继续添加节点
if (summod != 0) {
tempnode.next = ListNode(summod)
}
return nList.next //去除哑节点
}
}
```