【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;
}



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

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

javal链表相加求和!

面试遇到一算法题: You are given two non-empty linked lists representing two non-negative integers. The ...
  • qq_34587892
  • qq_34587892
  • 2017年07月27日 13:58
  • 352

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

struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) {...
  • liuyanfeier
  • liuyanfeier
  • 2016年06月03日 15:09
  • 1630

Java如何编写链表程序

使用Java语言编写链表程序的方法。
  • daijingxin
  • daijingxin
  • 2016年01月10日 22:25
  • 2845

Java算法之链表笔记记录

本篇主要介绍一种新的数据存储结构——链表。链表可能是继数组之后第二种使用得最广泛的通用存储结构。 链表的机制灵活,用途广泛,适用于许多通用数据库。它也可以取代数组,作为其他存储结构的基础,例如栈,队...
  • dingchenxixi
  • dingchenxixi
  • 2016年09月04日 13:55
  • 850

算法:两个单链表生成相加链表

算法:两个单链表生成相加链表标签(空格分隔): 算法 0版本:1 作者:陈小默 声明:禁止商业,禁止转载 发布于作业部落、[SCDN]题目:假设链表中的每一节点的值都在0~9之间,于是我们可以使用整个...
  • qq_32583189
  • qq_32583189
  • 2016年11月07日 18:30
  • 1054

链表实现两个数相加

给两个链表,每个节点存储一个数字,实现两个节点之间的数字相加,返回相加后的数字链表第一版的程序/** * Definition for singly-linked list. * public c...
  • hsz_zl
  • hsz_zl
  • 2016年11月26日 11:40
  • 608

链表——将两个链表上的数字相加(考虑进位)并将和放入新链表

题目: 给予两个链表,每个节点中有一个0-9的数字,将相应位置上的数字相加并进位,用新的链表存储其和。 例如: Input: (2 -> 4 -> 3) + (5 -> 6 -> 4) Ou...
  • jingsuwen1
  • jingsuwen1
  • 2016年05月09日 19:47
  • 1346

leetcode 5. 两个链表逐个元素相加 Add Two Numbers

问题:Add Two Numbers 难度-MediumYou are given two linked lists representing two non-negative numbers. ...
  • quzhongxin
  • quzhongxin
  • 2015年04月25日 16:23
  • 999

链表相加

给定两个链表,分别表示两个非负整数。他们的数字逆序存储在链表中,且每个节点只存储一个数字,计算两个数的和,并且返回和的链表头指正。 如:输入1->2>3 8->7->7 输出:0->0->0->1  ...
  • u014360070
  • u014360070
  • 2016年07月20日 20:36
  • 1230
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【Java】对两个用链表表示的整数求和
举报原因:
原因补充:

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