LeetCode 第2题 两数相加

/*  T2:两数相加

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

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

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)  输出:7 -> 0 -> 8  原因:342 + 465 = 807*/

/** * Definition for singly-linked list. */
1 class ListNode2 {
2
3   int val;
4   ListNode2 next;
5
6   ListNode2(int x) {
7     val = x;
8   }
9 }
/*  时间复杂度O(  max(n,m)  )  n,m代表链表长度.  思路:  其实就是模拟加法运算,只不过顺序与原来相反而已.         分别遍历2个链表         1.如果两个结点都不为空,就求出他们的和,如果他们的和大于10,就-10,存入当前值,然后让后面的数的和+1         2.如果有一个结点为空,可以吧空结点中的值当成0         3.如果2个结点都为空,说明遍历已经完毕,如果此时还有一位数未加入,如8+9=16,当前位只加入了6,但2个链表都已经            遍历完毕,这时应该再新分配一个结点保存当前的1.

第一个是自己写的代码,第二个是leetcode的代码,思路差不多,但是leetcode代码明显简洁许多. */
 1 class Solution2 {
 2
 3   public ListNode2 addTwoNumbers(ListNode2 l1, ListNode2 l2) {
 4     if (l1 == null) {
 5       return l2;
 6     }
 7     if (l2 == null) {
 8       return l1;
 9     }
10
11     ListNode2 list1 = l1;
12     ListNode2 list2 = l2;
13     ListNode2 dummyHead = new ListNode2(0);
14     ListNode2 curr = dummyHead;
15
16     int isGreatThan10 = 0;
17     while (list1 != null || list2 != null) {
18       if (list1 == null || list2 == null) {
19         ListNode2 notEmptyNode = (list1 == null ? list2 : list1);
20         if (isGreatThan10 == 1) {
21           isGreatThan10 = 0;
22           ++notEmptyNode.val;
23           if (notEmptyNode.val == 10) {
24             notEmptyNode.val = 0;
25             isGreatThan10 = 1;
26           }
27         }
28         curr.next = notEmptyNode;
29         curr = curr.next;
30         if (list1 != null) {
31           list1 = list1.next;
32         } else {
33           list2 = list2.next;
34         }
35       } else {
36         int sum = list1.val + list2.val + isGreatThan10;
37         isGreatThan10 = sum >= 10 ? 1 : 0;
38         curr.next = new ListNode2(isGreatThan10 == 1 ? sum - 10 : sum);
39         list1 = list1.next;
40         list2 = list2.next;
41         curr = curr.next;
42       }
43     }
44     if (isGreatThan10 == 1) {
45       curr.next = new ListNode2(1);
46     }
47     return dummyHead.next;
48   }
49 }
 1 class Solution2_1 {
 2
 3   public ListNode2 addTwoNumbers(ListNode2 l1, ListNode2 l2) {
 4     if (l1 == null) {
 5       return l2;
 6     }
 7     if (l2 == null) {
 8       return l1;
 9     }
10     ListNode2 dummyHead = new ListNode2(0);
11     ListNode2 curr = dummyHead;
12     int val1 = 0;
13     int val2 = 0;
14     int add = 0;
15
16     while (l1 != null || l2 != null) {
17       val1 = l1 == null ? 0 : l1.val;
18       val2 = l2 == null ? 0 : l2.val;
19       int sum = val1 + val2 + add;
20       curr.next = new ListNode2(sum % 10);
21       add = sum / 10;
22       curr = curr.next;
23       l1 = l1 == null ? null : l1.next;
24       l2 = l2 == null ? null : l2.next;
25     }
26     if (add > 0) {
27       curr.next = new ListNode2(add);
28     }
29     return dummyHead.next;
30   }
31 }

原文地址:https://www.cnblogs.com/rainbow-/p/10274175.html

时间: 2024-07-30 04:50:34

LeetCode 第2题 两数相加的相关文章

Leetcode(2)两数相加

Leetcode(2)两数相加 [题目表述]: 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和.您可以假设除了数字 0 之外,这两个数都不会以 0 开头. 第一种方法:大众解法 执行用时:80 ms: 内存消耗:12.2MB # Definition for singly-linked list. # class ListNode(object

leetcode第二题:两数相加

1. 题目(题目链接:https://leetcode-cn.com/problems/add-two-numbers) 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和. 您可以假设除了数字 0 之外,这两个数都不会以 0 开头. 示例: 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -

关于力扣第二题 ---两数相加

题目描述: 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和. 您可以假设除了数字 0 之外,这两个数都不会以 0 开头. 示例: 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807 解题思路:直接建一个l3,把传进来的l1 l2的val相

letcood 算法题 -- 两数相加

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元素. 示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1] 链接:https://leetcode-cn.com/problems/two-sum 我的解答: /** * @param

golang 算法题 : 两数相加

package main import "fmt" type ListNode struct { Val int Next *ListNode} func main() { l1 := &ListNode{ Val: 1, Next: &ListNode{ Val: 2, Next: &ListNode{ Val: 3, }, }, } l2 := &ListNode{ Val: 4, Next: &ListNode{ Val: 5, Next:

【leetcode】 算法题2 两数相加

问题 给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例: 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807 代码实现 #include <vector> #include <map> #include <iostream>

leetcode刷题2:两数相加add_two_numbers

题目:两数相加 (难度:中等) 给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字. 将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例: 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807 思路: 本题的思路很简单,按照小学数学中学习的加法原理从末尾到首位,对每一位对齐相加即可. 技巧在于如何处理不同长度的数字

leetcode 刷题(2)--- 两数相加

给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例: 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807 解法: class Solution {public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2

Leetcode 002.两数相加

1.题目描述 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和. 您可以假设除了数字 0 之外,这两个数都不会以 0 开头. 示例: 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807 2.易理解版本 2.1 解题思路 题中链表顺序正好是低