首页 > 技术文章 > 2.两数相加

YoungSone 2020-05-13 10:24 原文

代码:

 1 public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
 2         ListNode result=new ListNode(0);
 3         ListNode a=result;
 4         int fruit=0;
 5         while (l1!=null||l2!=null){
 6             int x=(l1==null?0:l1.val);
 7             int y=(l2==null?0:l2.val);
 8             int sum=x+y+fruit;
 9 
10             fruit=sum/10;
11             sum=sum%10;
12             a.next=new ListNode(sum);
13             a=a.next;
14             if (l1!=null){
15                 l1=l1.next;
16             }
17             if (l2!=null){
18                 l2=l2.next;
19             }
20         }
21         if (fruit==1){
22             a.next=new ListNode(fruit);
23         }
24         return result.next;
25     }
View Code

测试代码:

 1 package medium;
 2 
 3 
 4 public class Solution2 {
 5 
 6 
 7     public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
 8         ListNode result=new ListNode(0);
 9         ListNode a=result;
10         int fruit=0;
11         while (l1!=null||l2!=null){
12             int x=(l1==null?0:l1.val);
13             int y=(l2==null?0:l2.val);
14             int sum=x+y+fruit;
15 
16             fruit=sum/10;
17             sum=sum%10;
18             a.next=new ListNode(sum);
19             a=a.next;
20             if (l1!=null){
21                 l1=l1.next;
22             }
23             if (l2!=null){
24                 l2=l2.next;
25             }
26         }
27         if (fruit==1){
28             a.next=new ListNode(fruit);
29         }
30         return result.next;
31     }
32 
33     public static void main(String[] args) {
34         ListNode a1=new ListNode(9);
35         ListNode a2=new ListNode(5);
36         a1.next=a2;
37         ListNode b1=new ListNode(3);
38         ListNode b2=new ListNode(1);
39         b1.next=b2;
40         ListNode node=new Solution2().addTwoNumbers(a1,b1);
41         while (node!=null){
42             System.out.println(node.val);
43             node=node.next;
44         }
45 
46     }
47 }
View Code

链表结构:

 1 package medium;
 2 /**
 3 * @Description: (简单链表)
 4 * @Author YoungSone
 5 * @Date 2020/5/13 9:34
 6 * @version V1.0
 7 */
 8 public class ListNode {
 9     int val;
10     ListNode next;
11     ListNode(int x){
12         val=x;
13     }
14 }
View Code

 

关键点:单链表,引用传递,取余取商,进位

解题思路:首先了解题目需求,确定所使用的数据结构为单链表,建立对应数据结构

     然后通过while循环遍历单链表,通过判断节点是否为空对变量进行赋值,

     然后进行相应取余取商计算,在这一步中通过设定变量fruit值来实现进1操作组成sum值,得到新链表各个节点的val值,

     最后循环完毕之后再次对fruit进行判断是否为1,完成最后节点的添加。组成新的链表,返回result.next.

疑问:为什么是返回result.next,而不是a.next呢?因为在计算过程之中,a所指向的地址以发生改变不再是原来所指向的位置

图示:一开始 a,result同时指向节点1,随着a=a.next操作 a指向了节点2,而result还是指向节点1.通过返回result.next可以获得所有节点的值即正确结果

1 2 3 ... n

推荐阅读