Leetcode - Add Two Numbers
来源:互联网 发布:php printr 带格式化 编辑:程序博客网 时间:2024/06/06 01:13
Question
You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
Java Code
class ListNode { int val; ListNode next; ListNode(int x) { val = x; }}public ListNode addTwoNumbers(ListNode l1, ListNode l2) { int sum = 0, carry = 0; ListNode l1Temp = l1; ListNode l2Temp = l2; ListNode fatherNode = l1; while (l1Temp != null && l2Temp != null) { sum = l1Temp.val + l2Temp.val + carry;//计算对应节点和进位的总和 l1Temp.val = sum % 10;//相加结果的个位,保存在l1链表中 carry = sum / 10;//相加结果的十位,需要进位 fatherNode = l1Temp;//记录l1Temp的前驱节点,当l1Temp为空时使用 l1Temp = l1Temp.next; l2Temp = l2Temp.next; } if(l1Temp == null && l2Temp == null) { if(carry == 1) fatherNode.next = new ListNode(1); }else if(l1Temp != null && l2Temp == null) { sum = l1Temp.val + carry; if(sum < 10) { l1Temp.val = sum; }else { //处理所有可能的相加结果的进位 l1Temp.val = 0; while(sum == 10) { if(l1Temp.next != null) { sum = l1Temp.next.val + 1; l1Temp.next.val = sum % 10; l1Temp = l1Temp.next; }else { l1Temp.next = new ListNode(1); break; } } } }else { fatherNode.next = l2Temp;//l1尾节点的后继节点指定为l2的下一个节点 sum = l2Temp.val + carry; if(sum < 10) { l2Temp.val = sum; }else { l2Temp.val = 0; while (sum == 10) { if(l2Temp.next != null) { sum = l2Temp.next.val + 1; l2Temp.next.val = sum % 10; l2Temp = l2Temp.next; }else { l2Temp.next = new ListNode(1); break; } } } } return l1;}
说明
这里需要有三层嵌套的if-else逻辑分支
– 第1层,判断L1和L2链表哪个已经到达尾部,如果同时到达尾部这结束计算,否则进入下一层判断;
– 第2层,判断较短链表的尾节点处相加结果是否有进位,如果无进位则结束计算,否则进入下一层判断;
– 第3层,处理可能的连续进位时,判断最后一个节点是否有进位,如有则需要new一个ListNode,而且整个运算最多只需要new一个节点;
第一个需要注意的坑是当next引用为空时,l1Temp = l1Temp.next;这句就不能再使用了,所以这里存储了一个fatherNode备用;
相加结果直接存储在L1对应的节点中,如果L1比L2短,则将L1尾节点之后的结果保存在L2中,同时将L1尾节点指向当前的L2节点;
尤其注意1 + 999这种需要连续进位的情况
0 0
- LeetCode: Add Two Numbers
- LeetCode: Add Two Numbers
- [LeetCode]Add Two Numbers
- LeetCode Add Two Numbers
- Leetcode: Add Two Numbers
- LeetCode : Add Two Numbers
- LeetCode Add Two Numbers
- [LeetCode] Add Two Numbers
- Leetcode : Add Two Numbers
- 【leetcode】Add Two Numbers
- [LeetCode]Add Two Numbers
- leetcode Add Two Numbers
- LeetCode-Add Two Numbers
- [leetcode] Add Two Numbers
- [LeetCode] Add Two Numbers
- LeetCode - Add Two Numbers
- LeetCode | Add Two Numbers
- 【leetcode】Add Two Numbers
- Linux--虚拟机(VMware)下与宿主计算机共享文件夹
- Pthread创建线程后必须使用join或detach释放线程资源
- adb无法开启
- java中HashSet详解
- DROP/TRUNCATE分区引发的一系列问题
- Leetcode - Add Two Numbers
- getApplicationContext()、getApplication()之间的区别
- 计算机视觉牛人博客和代码汇总(全)
- 【CxImage 702】VS2010 编译和使用。。。
- idea离线破解
- Mac 可设置环境变量的位置、查看和添加PATH环境变量
- ElasticSearch Bulk 源码解析
- Linux下利用backtrace追踪函数调用堆栈以及定位段错误
- 3D Touch