题目:
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 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
标签:结点,ListNode,val,python,next,l2,l1,java,两数 From: https://www.cnblogs.com/liu-myu/p/16714855.html