LeetCode_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

翻译:给你两个正整数链表,反向存储,输出为相加后的结果,如上所示。








    代码:

    /**
     * @author MohnSnow
     * @time 2015年5月28日 下午3:31:45
     * @title
     */
    class ListNode {
    	int val;
    	ListNode next;
    
    	ListNode(int x) {
    		val = x;
    	}
    }
    
    public class Test {
    	/**
    	 * @author MohnSnow
    	 * @time 2015年5月28日 下午4:31:45
    	 * @title 注意边界条件,多余空间太多----自己写的太乱了,不够灵活
    	 */
    	@SuppressWarnings("null")
    	public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
    		int temp = 0;
    		ListNode l1_temp = null;
    		ListNode l2_temp = null;
    		for (l1_temp = l1, l2_temp = l2; (l1_temp.next != null) || (l2_temp.next != null); l1_temp = l1_temp.next, l2_temp = l2_temp.next) {
    			if (l1_temp.next != null && l2_temp.next == null) {// 此时可以单独去循环处理l1_temp
    				/*
    				 * temp += l1_temp.val; if (temp < 10) { l1_temp.val = temp;
    				 * return l1; } else { if (l1_temp.next == null) { l1_temp_1 =
    				 * null; l1_temp.next = l1_temp_1; l1_temp.val = temp % 10; temp
    				 * = temp / 10; l1_temp_1.val = temp; } else { l1_temp.val =
    				 * temp % 10; temp = temp / 10; l1_temp.next.val += temp; } }
    				 */
    				for (; l1_temp != null; l1_temp = l1_temp.next) {
    					temp += l1_temp.val;
    					if (temp < 10) {
    						l1_temp.val = temp;
    						return l1;
    					} else {
    						if (l1_temp.next == null) {
    							ListNode l1_temp_1 = null;
    							l1_temp.next = l1_temp_1;
    							l1_temp.val = temp % 10;
    							l1_temp_1.val = temp / 10;
    							return l1;
    						} else {
    							l1_temp.val = temp % 10;
    							temp = temp / 10;
    						}
    					}
    				}
    			} else if (l1_temp.next == null && l2_temp.next != null) {
    				/*
    				 * ListNode l1_temp_2 = null; l1_temp.next = l1_temp_2; temp =
    				 * temp + l2_temp.val; l1_temp_2.val = temp % 10; temp = temp /
    				 * 10;
    				 */
    				l1_temp.next = l2_temp.next;
    				for (; l1_temp != null; l1_temp = l1_temp.next) {
    					temp += l1_temp.val;
    					if (temp < 10) {
    						l1_temp.val = temp;
    						return l1;
    					} else {
    						if (l1_temp.next == null) {
    							ListNode l1_temp_1 = null;
    							l1_temp.next = l1_temp_1;
    							l1_temp.val = temp % 10;
    							l1_temp_1.val = temp / 10;
    							return l1;
    						} else {
    							l1_temp.val = temp % 10;
    							temp = temp / 10;
    						}
    					}
    				}
    			} else {
    				temp = temp + l1_temp.val + l2_temp.val;
    				if (temp < 10) {
    					l1_temp.val = temp;
    					temp = 0;
    					// System.out.println(l1_temp.val);
    				} else {
    					l1_temp.val = temp % 10;
    					temp = temp / 10;
    					// System.out.println(l1_temp.val);
    				}
    			}
    			if ((temp != 0) && (l1_temp.next == null) && (l2_temp.next == null)) {
    				ListNode l1_temp_1 = null;
    				l1_temp.next = l1_temp_1;
    				l1_temp_1.val = temp;
    				return l1;
    			}
    		}
    		return l1;
    	}
    
    	/**
    	 * @author Other https://leetcode.com/discuss/34322/java-o-n-easy-formatted
    	 * @time 2015年5月28日 下午4:31:45
    	 * @title
    	 */
    	public static ListNode addTwoNumbers1(ListNode l1, ListNode l2) {
    		for (ListNode lt1 = l1, lt2 = l2; lt1 != null || lt2 != null; lt1 = lt1.next, lt2 = lt2.next) {
    			if (lt2 == null) {// 单独讨论另一种情况,直接输出结果
    				for (; lt1.val >= 10;) {// 查看判断条件,判断条件是可以大于十的,不用拘泥于必须temp去存这个数,发散思维
    					lt1.val = lt1.val - 10;
    					if (lt1.next == null) {
    						lt1.next = new ListNode(1);// 看看人家定义一个新的对象的方式,学习一下,忘记temp方式。
    					} else {
    						lt1.next.val++;
    						lt1 = lt1.next;
    					}
    				}
    				return l1;
    			}
    			if (lt1 == null) {
    				for (; lt2.val >= 10;) {
    					lt2.val = lt2.val - 10;
    					if (lt2.next == null) {
    						lt2.next = new ListNode(1);
    					} else {
    						lt2.next.val++;
    						lt2 = lt2.next;
    					}
    				}
    				return l2;
    			}
    			int temp = lt1.val + lt2.val;
    			if (temp >= 10) {
    				temp = temp - 10;
    				if (lt1.next != null) {
    					lt1.next.val++;
    				} else if (lt2.next != null) {
    					lt2.next.val++;
    				} else {
    					lt2.next = new ListNode(1);// 这样便会只输出lt2
    				}
    			}
    			lt1.val = temp;// 同时修改两个链表的值,方便后面处理,只是多加了一条语句而已
    			lt2.val = temp;// 同时修改两个链表的值。方便后面处理,只是多加了一条语句而已
    		}
    		return l1;
    	}
    
    	public static void main(String[] args) {
    		ListNode l1 = new ListNode(2);
    		ListNode l2 = new ListNode(4);
    		ListNode l3 = new ListNode(6);
    		l1.next = l2;
    		l2.next = l3;
    		l3.next = null;
    		ListNode l4 = new ListNode(5);
    		ListNode l5 = new ListNode(6);
    		ListNode l6 = new ListNode(5);
    		l4.next = l5;
    		l5.next = l6;
    		l6.next = null;
    		ListNode l7 = null;
    		System.out.println("l1 Before: " + l1.val + " " + l1.next.val + " " + l1.next.next.val);
    		System.out.println("l4 Before: " + l4.val + " " + l4.next.val + " " + l4.next.next.val);
    		l7 = addTwoNumbers1(l1, l4);
    		// System.out.println("l1 After: " + l1.val + " " + l1.next.val + " " +
    		// l1.next.next.val + " " + l1.next.next.next.val);
    		System.out.println("l4 After: " + l4.val + " " + l4.next.val + " " + l4.next.next.val + " " + l4.next.next.next.val);
    		System.out.println("l7 Sum: " + l7.val + " " + l7.next.val + " " + l7.next.next.val + " " + l7.next.next.next.val);
    	}
    }


    • 0
      点赞
    • 0
      收藏
      觉得还不错? 一键收藏
    • 0
      评论
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值