LeetCode: Add Two Numbers
来源:互联网 发布:pos机数据库文件名 编辑:程序博客网 时间:2024/05/17 06:16
LeetCode: Add Two Numbers
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
这道题不算复杂,而且算是链表里经典的一道题了,掌握好链表的结构其实并不难,只是有点繁琐。
1.题目给的两个数字是用链表表示的,而且注意到链表表示出来的是它们的逆序,得出来的结果也是逆序表示的,所以不需要将原始数据做反转处理,直接按照链表从头到尾的顺序处理就行。
2.还需要注意的是给出原始数据有可能长度并不是一致的,这在代码里需要考虑到。
3.数字相加的进位处理。
4.最后一位如果还有进位,还需要在开辟一个节点。
5.算法的健壮性,存在原始数据为空的情况。
笔者在思考这道题时,为了不破坏最初的链表,用到了两个节点first和second分别表示第一个数字和第二个数字。同时用到了head和end节点来存储结果的始末,计算出来的结果直接return head就ok了。
接下来就是处理数字相加时的情况,除了两个节点的相加,还要考虑到前面数值计算时所产生的进位(add),再进行取模预算(temp%10)表示需要存储的值,以及新的进位(temp/10).
int temp=first.val+second.val+add;int digit=temp%10;add=temp/10;
创建新的节点,与end来连接起来。
ListNode newnode=new ListNode(digit);
循环处理直到其中有链表为空,在用进位与其后续节点进行计算
while(first!=null){//first还有数据没处理完 int temp=first.val+add; int digit=temp%10; add=temp/10; first.val=digit; end.next=first; end=end.next; first=first.next; }
second的处理情况一样。
最后就是,链表的节点遍历完了之后add任有可能为1,需要作出判断:
if(add==1){ //如果最后add不为0,新建一个节点(1) ListNode newnode=new ListNode(add); end.next=newnode; end=end.next; }
下面是在leetcode上Accepted的代码:
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */public class Solution { public ListNode addTwoNumbers(ListNode l1, ListNode l2) { ListNode head=null; ListNode end=head; ListNode first=l1; ListNode second=l2; int add=0; //进位 while(first!=null&&second!=null){ int temp=first.val+second.val+add; //进位与两个数值相加 int digit=temp%10; add=temp/10; ListNode newnode=new ListNode(digit); if(head==null){ head=newnode; end=newnode; } else { end.next=newnode; end=end.next; } first=first.next; second=second.next; } while(first!=null){//first还有数据没处理完 int temp=first.val+add; int digit=temp%10; add=temp/10; first.val=digit; end.next=first; end=end.next; first=first.next; } while(second!=null){//Second还有数据没处理完 int temp=second.val+add; int digit=temp%10; add=temp/10; second.val=digit; end.next=second; end=end.next; second=second.next; } if(add==1){ //如果最后add不为0,新建一个节点(1) ListNode newnode=new ListNode(add); end.next=newnode; end=end.next; } return head; }}
1 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
- poj2823Sliding Window【线段树维护滚动区间最值】
- 我的第一个安卓小实验
- iOS 玩转推送通知
- 开发自己的QQ游戏
- ubuntu下安装NFS服务
- LeetCode: Add Two Numbers
- mybatis--关联映射及延迟加载
- go语言select关注点
- 欢迎使用CSDN-markdown编辑器
- android6.0 Dangerous permissions and permission groups.
- 常用书籍--经典
- Python之数组(array)使用方法总结与Numpy中的数组用法
- JAVA基础
- 课堂练习54页动手练习5