2.两数相加
代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
测试代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
链表结构:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
关键点:单链表,引用传递,取余取商,进位
解题思路:首先了解题目需求,确定所使用的数据结构为单链表,建立对应数据结构
然后通过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 |