2. 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

 //本题的核心是反向进位,即,l1与l2同位置的元素相加,需要向后而非向前+1。
 //可以采用的解决思路有两个
 //1. 将l1和l2还原成整数,对其相加后再反向放入List。
 //   优点:简单直观
 //   缺点:如果链表足够长,其组成的数字超过2^31-1,则超出了int的极值
 //2. 反向进位,即同位置元素相加,若要进位则向后进一位(即本解)
 //   弥补了如果链表过长可能造成的溢出问题。
public class Solution {
	public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
		ListNode head = new ListNode(0);
		ListNode d = head;
		int sum = 0;
		//只要l1或者l2尚有剩余元素,则继续遍历,每次都将l1和l2的同位置元素相加后除以10求余,所得余数就是这一位的最终结果
		
		while (l1 != null || l2 != null) {
			if (l1 != null) {
				sum = sum + l1.val;
				l1 = l1.next;
			}
			if (l2 != null) {
				sum = sum + l2.val;
				l2 = l2.next;
			}
			ListNode tmp = new ListNode(1);
				tmp.val = sum % 10;
				d.next = tmp;
				d = d.next;
				sum = sum / 10;//sum保留的每一步的进位值
		}
		//如果最后一位相加产生进位,则在链表的最后添加一个新的val=1的元素
		if(sum == 1){
			d.next = new ListNode(1);
		}

		return head.next;
	}
}

与本题结果无关,但是在解题过程中发现的Tips  

1. 通过移位运算来进行2的指数运算,即231 等价于 2<<30,在二进制中,10向左移30位,即2^31,这样做的执行效率极快,亦不用通过Math.pow来完成

2. long num = 2; 所定义的类型依然是int, 如果要定义一个long,则long num = 2L,需要加上L

 

附Java内置类型。值得注意的是,Java的内置类型的取值范围是定值,不是根据计算机的位数来动态决定的。

类型名称类型定义类型取值
boolean 布尔值,作二元判断 truefalse
byte 8位有符号整数 最小值-128,最大值127
short 16位有符号整数 最小值-32768,最大值32767
int 32位有符号整数 最小值-2147483648(-231),最大值2147483647(231-1)
long 64位有符号整数 -263~(263-1)
float 32位浮点数 1.4E-45~3.4028235E38
double 64位浮点数 4.9E-324~1.7976931348623157E308
char 16位Unicode字符 不适用
posted @ 2016-02-04 14:19  Ray.Yang  阅读(209)  评论(0编辑  收藏  举报