LeetCode 第2题 两数相加

Posted _colorful

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }

 
































以上是关于LeetCode 第2题 两数相加的主要内容,如果未能解决你的问题,请参考以下文章

精选力扣500题 第23题 LeetCode 2. 两数相加c++详细题解

LeetCode Java刷题笔记—445. 两数相加 II

leetcode 算法题2 两数相加

LeetCode Java刷题笔记—2. 两数相加

LeetCode第2天 - 2. 两数相加

#yyds干货盘点# LeetCode面试题:两数相加