用链表表示 数字 ,求和 leetcode cc

package Link;

import java.util.ArrayList;
import java.util.Scanner;

/**
 * @Title: LinkedList_AddSum.java
 * @Package Link
 * @Description: You have two numbers represented by a linked list, where each
 *               node contains a sin- gle digit The digits are stored in reverse
 *               order, such that the 1’s digit is at the head of the list Write
 *               a function that adds the two numbers and returns the sum as a
 *               linked list
 * 
 *               Input: (3 -> 1 -> 5), (5 -> 9 -> 2) Output: 8 -> 0 -> 8
 * @author nutc
 * @date 2013-7-15 下午1:27:26 自己有改过哟
 * @version V1.0 Input: (3 -> 1 -> 5), (5 -> 9 -> 2) Output: 9 -> 0 -> 7
 *          (9->9->9->9->9),(1) (0),(0) (9->2->0),(8->9)
 * 
 *          抽自己一万遍!!无数次忘记循环了!!!! s = s.replace()!!! 只能说指针太容易出错了.....
 */
public class LinkedList_AddSum_Reverse {

	public static ArrayList<LinkedList> alllist = new ArrayList<LinkedList>();

	public static void main(String args[]) {

		getInput();
	}

	public static void getInput() {

		Scanner scan = new Scanner(System.in);
		String input = scan.nextLine();
		String[] num = input.split(","); // 不能写‘,’!!!!
		for (int i = 0; i < num.length; i++) {
			String s = num[i];
			// @@@@@@@@@@@ 要写成 s = s.re... 只有返回结果才是改变后的!!! 并不是在原来的str上做改变!!!!
			s = s.replace("(", "");
			s = s.replace(")", "");
			s = s.replace(" ", "");
			String[] strarray = s.split("->");
			LinkedList list = new LinkedList();
			for (int j = 0; j < strarray.length; j++) {
				list.addNode(Integer.parseInt(strarray[j]));
			}
			alllist.add(list);
		}
		addSum2(alllist.get(0).head, alllist.get(1).head).display();
		// getSum().display();
	}

	public static Node addSum2(Node n1, Node n2) {
		if (n1 == null)
			return n2;
		if (n2 == null)
			return n1;

		Node pre = null, nsum = null, sumnow = null;

		while (n1 != null && n2 != null) {  //还是不对》。。而且太多循环....

			int sum = n1.data + n2.data;
			if (sum > 10) {
				if (pre == null) {
					Node n = new Node(1);
					n.next = nsum;
					nsum = n;
					pre = nsum;
					while (pre.next != sumnow) {
						if (pre.data == 9)
							pre.data = 0;
						pre = pre.next;
					}
				} else {
					pre.data++;
					while (pre.next != sumnow) {
						pre.next.data = 0;
						pre = pre.next;
					}
				}

			}

			Node n = new Node(sum%10);
			if (nsum == null) {
				nsum = n;
				sumnow = n;
			} else {
				sumnow.next = n;
				if (sumnow.data != 9)
					pre = sumnow;
				sumnow = sumnow.next;
			}

			n1 = n1.next;
			n2 = n2.next;
		}
		if (n1 != null)
			n2 = n1;
		while (n2 != null) {
			Node n = new Node(n2.data);
			sumnow.next = n;
			sumnow = sumnow.next;
		}

		return nsum;
	}

	// public static public static void addSum3(LinkedList list1, LinkedList
	// list2) {
	// Node l1 = list1.head, l2 = list2.head;
	//
	// Node head = null, pre = null, p = null, q = null;
	// while (l1 != null && l2 != null) {
	// int sum = (l1.data + l2.data);
	// Node now = new Node(sum % 10);
	// q.next = now;
	// pre = q;
	// q = q.next;
	// if (sum >= 9) {
	// if (sum > 9) {
	// if (p != null) {
	// p.data++;
	// p = p.next;
	// while (p != q) {
	// p.data = 0;
	// }
	// p = null;
	// } else {
	// pre.data++;
	// }
	// Node now2 = new Node(sum - 10);
	// now2.next = q;
	// p = now2;
	// }
	// } else {
	// p = pre;
	// }
	// }
	// }

	public static LinkedList getSum() {
		for (int i = 0; i < alllist.size(); i++) {
			alllist.get(i).display();
			Reverse(alllist.get(i));
			System.out.print("旋转后:");
			alllist.get(i).display();
		}

		LinkedList sum = Join(alllist.get(0), alllist.get(1));
		Reverse(sum);
		return sum;

	}

	public static LinkedList Join(LinkedList list1, LinkedList list2) {
		Node n1 = list1.head, n2 = list2.head;
		LinkedList sum = new LinkedList();
		int add = 0, num;
		while (n1 != null && n2 != null) {
			num = n1.data + n2.data + add;
			if (num > 9) {
				add = 1;
				num = num - 10;
			} else {
				add = 0;
			}
			// 不要忘记循环!!
			n1 = n1.next;
			n2 = n2.next;
			sum.addNode(num);
		}
		if (n2 != null)
			n1 = n2;
		if (n1 != null) {
			while (n1 != null) {
				num = n1.data + add;
				if (num > 9) {
					add = 1;
					num = num - 10;
				} else {
					add = 0;
				}
				n1 = n1.next; // 我又再次。。。忘记循环了。。。。再次。。。我去
				sum.addNode(num);
			}
		}
		// 忘记了最后一个进位!!!
		if (add == 1) {
			sum.addNode(1);
		}
		return sum;
	}

	public static void Reverse(LinkedList list) {
		Node now = list.head;
		if (now == null || now.next == null)
			return;
		Node pre = null, next = null;
		while (now != null) {
			next = now.next;
			now.next = pre;
			pre = now;
			now = next;
		}
		pre.display();
		list.head = pre;

		// 错误代码。。。智障一般。。。 next都是null还判断个神马!!
		// Node pre = null, next = null;
		// while (next != null) {
		// next = now.next;
		// now.next = pre;
		//
		// pre = now;
		// now = next;
		// }
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值