【Java】对两个用链表表示的整数求和

原创 2015年07月09日 10:05:23

给定两个用链表表示的整数,每个结点包含一个数位。这些数位是反向存放的,也就是个位排在链表首部。编写函数对这两个整数求和,并用链表形式返回结果。

	public LinkedList addLists(LinkedList l1, LinkedList l2, int carry){
		if (null == l1 && null == l2 && 0 == carry) return null;
		LinkedList result = new LinkedList();
		int value = carry;
		if (l1 != null) value += l1.data;
		if (l2 != null) value += l2.data;
		result.data = value % 10;
		LinkedList more = addLists(null == l1? null : l1.next, null == l2? null : l2.next, value > 10? 1 : 0);
		result.setNext(more);
		return result;
		
	}


注意要避开空指针一场,如果两个数位数不同,需要在较小数的末尾补零进行相加

public class PartialSum {
	public LinkedList sum = null;
	public int carry = 0;
}

LlinkedList addLists(LinkedList l1, LinkedList l2) {
	int len1 = length(l1);
	int len2 = length(l2);
	
	if(len1 < len2) {
		l1 = padList(l1, len2 - len1);
	}
	else {
		l2 = padList(l2, len1 - len2);
	}
	
	PartialSum sum = addListsHelper(l1, l2);
	if (sum.carry == 0) {
		return sum.sum;
	}
	else {
		LinkedList result = interBefore(sum.sum, sum.carry);
		return result;
	}
}

PartialSum addListsHelper(LinkedList l1, LinkedList l2) {
	if (null == l1 && null == l2) {
		PartialSum sum = new PartialSum();
		return sum;
	}
	
	PartialSum sum = addListHelper(l1.next, l2.next);
	int val = sum.carry + l1.data + l2.data;
	LinkedList full_result = insetBefore(sum.sum, val%10);
	sum.sum = full_result;
	sum.carry = val / 10;
	return sum;
}

LinkedList padList(LinkedList l, ind padding) {
	LinkedList head = l;
	for (int i = 0; i< padding; i++) {
		LinkedList n = new LinkedList(0, null, null);
		head.pre = n;
		n.next = head;
		head = n;
	}
	return head;
}

LinkedList insetBefore(LinkedList list, int data) {
	LinkedList node = new LinkedList(data, null, null);
	if(list != null) {
		list.prev = node;
		node.next = list;
	}
	return node;
}

int length(LinkedList l) {
	int count = 0;
	LinkedList p = l;
	if (null == l) return 0;
	while (p != null) {
		count++;
		p = p.next;
	}
	return count;
}



9.2链表(五)——给定两个用链表表示的整数,每个结点包含一个数位。这些数位是反向存放的,也就是个位排在链表首部

/**  * 功能:给定两个用链表表示的整数,每个结点包含一个数位。这些数位是反向存放的,也就是个位排在链表首部。  * 编写函数对这两个整数求和,并用链表形式返回结果。  * 进阶:假设这些数...

给定两个链表表示的整数,编写函数对这两个整数求和,并用链表形式返回结果。

struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) {...

求两个用链表表示的整数的和

给定两个用链表表示的整数,每个结点包含一个数位。这些数位是反向存放的,也就是个位排在链表首部。编写函数对这两个整数求和,并用链表形式返回结果。 进阶       假设这些数位是正向存放的。...

链式A+B

题目描述 有两个用链表表示的整数,每个结点包含一个数位。这些数位是反向存放的,也就是个位排在链表的首部。编写函数对这两个整数求和,并用链表形式返回结果。 给定两个链表ListNode*...

记一次上机题目——两个表示数字的链表之和

你有两个用链表代表的整数,其中每个点包含一个整数。证书存储按照在原来证书中想法的顺序,是的第一个数字位于链表的开头,写出一个函数将两个整数相加,用链表返回和。(Tencent) 主要是代码风格的...

【LeetCode-面试算法经典-Java实现】【002-Add Two Numbers (单链表表示的两个数相加)】

有两个单链表,代表两个非负数,每一个节点代表一个数位,数字是反向存储的,即第一个结点表示最低位,最后一个结点表示最高位。求两个数的相加和,并且以链表形式返回。对两个链表都从第一个开始处理,进行相加,结...

算法:经典leetcode算法题解

1. Patching Array 补丁数组(考虑ing) 原题描述:https://leetcode.com/problems/patching-array/ 给定一个有序正整数数组nums以及...
  • ztf312
  • ztf312
  • 2016年03月30日 13:50
  • 874

(分片连接池)客户端分片的Jedis分布式(Sharding/shared一致性哈希)(redis2.8)

目前Redis(2.8)实现集群的方法主要是采用一致性哈稀分片(Shard),将不同的key分配到不同的redis server上,达到横向扩展的目的 Memcached是在Server端完成Sha...

c两个整数求和

  • 2014年09月15日 18:48
  • 6KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【Java】对两个用链表表示的整数求和
举报原因:
原因补充:

(最多只允许输入30个字)