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;
}
}
Add two numbers
最新推荐文章于 2021-02-19 08:37:33 发布