Add two numbers

package com.swjtu.easy.twosum;

/**
 * LeetCode Problems List No.2 Add Two Numbers
 * remarks: 
 * 			java linked list 节点的构建顺序(先创建的节点在尾部);
 * 			各位数字相加要处理进位问题(单个进位、连续进位等);
 * 			linked list 长度是否相等的情况;
 * @author tangmin
 * @create 2017年2月25日 下午4:45:02
 */
public class TwoSum {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		demo();
	}
	
	/**
	 * ListNode 创建过程
	 * @param nodeNum
	 * @return
	 * 2017年2月25日下午4:38:30
	 */
	public ListNode createListNodes (int nodeNum) {
		ListNode listNode = null;
		
		for(int i = 1; i <= nodeNum ; i++) {
			ListNode tmp = new ListNode(i);
			tmp.next = listNode;
			listNode = tmp;
		}
		
		return listNode;
	}
	public ListNode createListNodes (int[] nodeNum) {
		ListNode listNode = null;
		
		for(int i = nodeNum.length-1; i >= 0 ; i-- ) {
			ListNode tmp = new ListNode(nodeNum[i]);// 先创建的节点在尾部
			tmp.next = listNode;
			listNode = tmp;
		}
		
		return listNode;
	}
	
	
	/**
	 * 打印内容,查看顺序
	 * @param listNode
	 * 2017年2月25日下午4:39:32
	 */
	public void printListNodes(ListNode listNode) {
		ListNode pNode = listNode;
		for (; pNode.next!=null; pNode = pNode.next) {
			System.out.print(pNode.val+"->");
		}
		System.out.println(pNode.val);
	}
	
	/**
	 * 演示构建顺序
	 * 
	 * 2017年2月25日下午4:43:18
	 */
	public static void demo() {
		TwoSum ts = new TwoSum();
		// 1. 简单创建
//		ListNode listNode =  ts.createListNodes(5);
//		ts.printListNodes(listNode);
		
		// 2. 数组创建
		int [] nums1 = new int[] {1, 4, 3};
		int [] nums2 = new int[] {3, 6, 4};
		
//		int [] nums1 = new int[] {0};
//		int [] nums2 = new int[] {7,4};
		
//		int [] nums1 = new int[] {2,4,3,9};
//		int [] nums2 = new int[] {5,6,6};
		
//		int [] nums1 = new int[] {5};
//		int [] nums2 = new int[] {5};
		
//		int [] nums1 = new int[] {9,8};
//		int [] nums2 = new int[] {1};
		
		ListNode listNode1 = ts.createListNodes(nums1);
		ListNode listNode2 = ts.createListNodes(nums2);
		ts.printListNodes(listNode1);
		ts.printListNodes(listNode2);
		// 3. 加法运算
		ts.printListNodes(new Solution().addTwoNumbers(listNode1, listNode2));
	}
	
}

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class ListNode {
   int val;
   ListNode next;
   ListNode(int x) { val = x; }
}

/**
 * java 中链表的实现方式:越先创建的节点越靠近表的尾部
 * @author tangmin
 * @create 2017年2月23日 下午4:25:17
 */
class Solution {
	
	public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
		  ListNode p1 = l1, p2 = l2;
		  int carry = 0, remainder = 0;
		  int len1=0,len2=0;
		  while (p1!=null){
			  len1++;
			  p1 = p1.next;
		  }
		  while (p2!=null) {
			  p2 = p2.next;
			  len2++;
		  }
		  ListNode head = (len1>len2)?l1:l2;
		  p1 = (len1>len2)?l1:l2;
		  p2 = (len1>len2)?l2:l1;
		  while(p2.next!=null) {
		      remainder = (p1.val+p2.val+carry)%10; 	// 结果先暂存
		      carry = (p1.val+p2.val+carry)/10;
		      p1.val = remainder;
		      p2 = p2.next;
		      p1 = p1.next;
		  }
		  remainder = (p1.val+p2.val+carry)%10; 		// 结果先暂存
	      carry = (p1.val+p2.val+carry)/10;
	      p1.val = remainder;
	      
		  while(carry>0 && p1.next != null) {			// 循环进位问题
			  p1 = p1.next;
			  remainder = (p1.val+carry)%10;
	      	  carry = (p1.val+carry)/10;
	      	  p1.val = remainder;
	      	
		  }
		  if (p1.next==null && carry!=0) {
			  p1.next = new ListNode(carry);
		  }
		  return head;
	}
	
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值