[LeetCode] 2. Add Two Numbers
You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order, and each of their nodes contains a single digit. Add the two numbers and return the sum as a linked list.
You may assume the two numbers do not contain any leading zero, except the number 0 itself.
Example 1:
Input: l1 = [2,4,3], l2 = [5,6,4] Output: [7,0,8] Explanation: 342 + 465 = 807.
Example 2:
Input: l1 = [0], l2 = [0] Output: [0]
Example 3:
Input: l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9] Output: [8,9,9,9,0,0,0,1]
Constraints:
- The number of nodes in each linked list is in the range
[1, 100]
. 0 <= Node.val <= 9
- It is guaranteed that the list represents a number that does not have leading zeros.
两数相加。
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/add-two-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
这题不难,思路是直接做加法,因为linked list给你的时候头结点是数字的最低位,不需要做reverse之类的操作,记得最后判断是不是还有额外的一个进位。
一般链表的题目只涉及操作,不涉及特别复杂的算法,所以具体做法和思路可以参见代码注释。
时间O(n)
空间O(1)
JavaScript实现
1 /** 2 * Definition for singly-linked list. 3 * function ListNode(val) { 4 * this.val = val; 5 * this.next = null; 6 * } 7 */ 8 /** 9 * @param {ListNode} l1 10 * @param {ListNode} l2 11 * @return {ListNode} 12 */ 13 var addTwoNumbers = function (l1, l2) { 14 // 一般链表的题目都需要dummy node 15 let dummy = new ListNode(0); 16 let cur = dummy; 17 let sum = 0; 18 // 为两个链表分别设置一个节点以供遍历 19 let p1 = l1; 20 let p2 = l2; 21 while (p1 !== null || p2 !== null) { 22 if (p1 !== null) { 23 sum += p1.val; 24 p1 = p1.next; 25 } 26 if (p2 !== null) { 27 sum += p2.val; 28 p2 = p2.next; 29 } 30 // 为下一个节点做准备,这个节点记录的是当前计算结果的个位数 31 // e.g. 9 + 5 = 14, cur.next = 14 32 cur.next = new ListNode(sum % 10); 33 // 这里若有进位,sum可以把进位带到下一个节点 34 // sum = parseInt(sum / 10); 35 sum = Math.floor(sum / 10); 36 sum %= 10; 37 // traverse到下一个节点 38 cur = cur.next; 39 } 40 // 如果遍历完毕还有进位,说明还需要加一个节点,节点值为1 41 if (sum === 1) { 42 cur.next = new ListNode(1); 43 } 44 return dummy.next; 45 };
Java实现
1 /** 2 * Definition for singly-linked list. 3 * public class ListNode { 4 * int val; 5 * ListNode next; 6 * ListNode(int x) { val = x; } 7 * } 8 */ 9 class Solution { 10 public ListNode addTwoNumbers(ListNode l1, ListNode l2) { 11 // 一般链表的题目都需要dummy node 12 ListNode dummy = new ListNode(0); 13 ListNode cur = dummy; 14 int sum = 0; 15 // 为两个链表分别设置一个节点以供遍历 16 ListNode p1 = l1; 17 ListNode p2 = l2; 18 while (p1 != null || p2 != null) { 19 if (p1 != null) { 20 sum += p1.val; 21 p1 = p1.next; 22 } 23 if (p2 != null) { 24 sum += p2.val; 25 p2 = p2.next; 26 } 27 // 为下一个节点做准备,这个节点记录的是当前计算结果的个位数 28 // e.g. 9 + 5 = 14, cur.next = 14 29 cur.next = new ListNode(sum % 10); 30 // 这里若有进位,sum可以把进位带到下一个节点 31 sum /= 10; 32 // traverse到下一个节点 33 cur = cur.next; 34 } 35 // 如果遍历完毕还有进位,说明还需要加一个节点,节点值为1 36 if (sum == 1) { 37 cur.next = new ListNode(1); 38 } 39 return dummy.next; 40 } 41 }
相关题目