力扣2(java&python)-两数相加(中等)

题目:

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

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

示例1:

输入:l1 = [2,4,3], l2 = [5,6,4]

输出:[7,0,8]

解释:342 + 465 =807

示例 2:

输入:l1 = [0], l2 = [0]
输出:[0]
示例 3:

输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]
 

提示:

每个链表中的节点数在范围 [1, 100] 内
0 <= Node.val <= 9
题目数据保证列表表示的数字不含前导零

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/add-two-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

1.仍然先初始化一个指针dummy,该指针的下一个结点指向真正的头结点head;

2.将两个链表看成同等长度进行遍历,如果一个链表较短,则在最前面补0,例如:9998+932= 9998+0932=10930;

3.每计算当前两个数字的和时,需要加上上一位的进位值,并且也需要计算出当前进位的值;

4.链表全部遍历完后,最后一位也有进位值时,在新链表最后添加一个新的结点,并且题中给了每个结点值在0~9,故进位值不可能大于1,则直接添加结点1即可。

例如:9998+932= 9998+0932=10930,模拟计算过程

1.初始准备工作

 2.计算8+2的当前值以及进位值,更新结点位置

 3.计算9+3的当前值以及进位值,更新结点位置

4. 计算9+9的当前值以及进位值,更新结点位置

 5.计算L1中的最后一个9和L2补位的0的值以及进位的值

 6.遍历结束,上一位还留有进制位,补充新结点

7.最后返回dummy.next

 java代码:

 1 /**
 2  * Definition for singly-linked list.
 3  * public class ListNode {
 4  *     int val;
 5  *     ListNode next;
 6  *     ListNode() {}
 7  *     ListNode(int val) { this.val = val; }
 8  *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 9  * }
10  */
11 class Solution {
12     public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
13         //设置一个虚拟结点
14         ListNode dummy = new ListNode(0);
15         //设置一个可移动指针,存储当前结点
16         ListNode cur = dummy;
17         //设置一个进位指针
18         int carry = 0;
19 
20         while(l1 != null || l2 != null){
21             //取当前位的值,如果当前位空,就补0,保证两个整数的位数相同
22             int a =(l1 != null) ? l1.val : 0;
23             int b =(l2 != null) ? l2.val : 0;
24             int sum = a + b + carry;
25 
26             //进位值
27             carry = sum / 10;
28             //当前位的值
29             sum %= 10;
30             //创建一个新的结点保存当前结点的值
31             cur.next = new ListNode(sum);
32             //链表结点后移
33             cur = cur.next;
34             //将两个链表往后移
35             if(l1 != null) l1 = l1.next;
36             if(l2 != null) l2 = l2.next;
37         }
38         //如果最后两个数相加有进位值,将进位数赋予新的结点
39         //结点值在0~9,故进位最多为1
40         if(carry == 1){
41             cur.next = new ListNode(carry);
42         }
43         return dummy.next;
44     }
45 }

 python3代码:

注意:pyhton3中:" / "表示浮点数除法,返回浮点float结果," // "表示整数除法,返回一个不大于" / "计算结果的最大整数int,故这里使用'//'。

 1 # Definition for singly-linked list.
 2 # class ListNode:
 3 #     def __init__(self, val=0, next=None):
 4 #         self.val = val
 5 #         self.next = next
 6 class Solution:
 7     def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
 8         dummy = ListNode(0)
 9         cur = dummy
10         carry = 0
11         while l1 != None or l2 != None:
12             # 补0或者取本来的值
13             a = l1.val if l1 != None else 0
14             b = l2.val if l2 != None else 0
15             sum = a + b + carry
16             
17             carry = sum // 10
18             sum %= 10
19 
20             cur.next = ListNode(sum)
21             cur = cur.next
22             # 两链表后移
23             if l1 != None:
24                 l1 = l1.next
25             if l2 != None:
26                 l2 = l2.next
27             
28         if carry == 1:
29             cur.next = ListNode(carry)
30 
31         return dummy.next

 

posted on 2022-09-21 10:57  我不想一直当菜鸟  阅读(167)  评论(0编辑  收藏  举报