leetcode-2 Add Two Numbers 计算两个对应的列表和问题
2015-09-26 17:04
253 查看
1.问题描写叙述:
You are given two linked lists representing two non-negativenumbers. The digits are stored in reverse order and each of their nodes containa single digit. Add
the two numbers and return it as a linked list.
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
http://www.programcreek.com/2012/12/add-two-numbers/
链表的定义:
这里注意考虑多种情况就可以:即考虑两个链表长度不一致,遍历完链表仍有进位的情况。
解法一:较为繁琐的分类讨论方法,避免使用
解法二:较优的解法。但在leetcode上执行时间要劣于前者
1.问题描写叙述:
You are given two linked lists representing two non-negativenumbers. The digits are stored in reverse order and each of their nodes containa single digit. Add
the two numbers and return it as a linked list.
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
http://www.programcreek.com/2012/12/add-two-numbers/
链表的定义:
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */
这里注意考虑多种情况就可以:即考虑两个链表长度不一致,遍历完链表仍有进位的情况。
解法一:较为繁琐的分类讨论方法,避免使用
public class Solution { public ListNode addTwoNumbers(ListNode l1, ListNode l2) { if((l1==null)||(l2==null)) { return null; } int temp_val = l1.val + l2.val; int go = temp_val /10; ListNode result = new ListNode(temp_val%10); l1 = l1.next; l2 = l2.next; ListNode temp = result; while((l1!=null)&&(l2!=null)) { temp_val = l1.val + l2.val + go; ListNode temp2 = new ListNode(temp_val%10); temp.next = temp2; temp = temp2; l1 = l1.next; l2 = l2.next; go = temp_val /10; } while(l1!=null) { temp_val = l1.val + go; ListNode temp2 = new ListNode(temp_val%10); temp.next = temp2; temp = temp2; l1 = l1.next; go = temp_val /10; } while(l2!=null) { temp_val = l2.val + go; ListNode temp2 = new ListNode(temp_val%10); temp.next = temp2; temp = temp2; l2 = l2.next; go = temp_val /10; } if(go != 0) { temp.next = new ListNode(go); } return result; } }
解法二:较优的解法。但在leetcode上执行时间要劣于前者
public class Solution { public ListNode addTwoNumbers(ListNode l1, ListNode l2) { int carry = 0;//表示进位 ListNode head = new ListNode(0);//首前节点,參照C++的尾后节点 ListNode temp = head; //一直循环至将两个链表遍历全然才退出 while((l1 != null)||(l2 != null)) { //仅需确定和的几个因子大小就可以; int first = (l1 != null) ? l1.val : 0;//使用if语句亦可 int second = (l2 != null) ? l2.val : 0; int result = first + second + carry;//每一次循环计算结果 carry = result /10; ListNode pNode = new ListNode(result % 10); temp.next = pNode; temp = pNode;//准备下一循环 if (l1 != null) { l1 = l1.next; } if (l2 != null) { l2 = l2.next; } } //还需考虑carray不等于0及仍有进位的情况 if (carry > 0) { temp.next = new ListNode(carry); } return head.next;//注意此返回值 } }
相关文章推荐
- Clairewd’s message--hdu4300(Next数组的运用)
- arraylist等记录修改次数modCount有什么作用?
- 【从头开始学算法】选择排序 插入排序 冒泡排序
- CodeForces 483C Diverse Permutation
- 浅谈Javascript中Object与Function对象
- 单点登录实现思路
- 多线程GCD的使用
- Hadoop运维手记
- 剑指 offer:二叉树的镜像
- Runtime 隐藏Status Bar背景
- 指针存储空间个数
- 白话经典算法系列之七 堆与堆排序
- Action访问Servlet API的对象
- 延迟脚本
- 单点登录实现思路
- 未初始化变量详解
- UDP用户数据报协议
- 多线程的优先级与休眠
- Oracle常用函数
- java web 分页查询、显示