两个数相加(可类似的写出两个无穷大的数的-简单计算)

题目:

您将获得两个非空链表,表示两个非负整数。数字以相反的顺序存储,每个节点包含一个数字。添加两个数字并将其作为链接列表返回。

您可以假设这两个数字不包含任何前导零,除了数字0本身。

样例:

输入:(2  - > 4  - > 3)+(5  - > 6  - > 4)
 输出: 7  - > 0  - > 8
 说明: 342 + 465 = 807

分析:两个数相加,按位相加,这是可以很容易的想到小学学习的竖式加法,而此题正是模拟竖式加减。

1、想到的是按位相加,按位相加就存在一个进位的问题,怎么进位,很简单大于9就进位,留下的就是与十的取模;

2、最高位相加进位怎么办呢?(先保留此问题)

3、两个数的位数不同怎么办的

package test;

class ListNode {
	int val;
	ListNode next;//伪指针
	ListNode(int x) { //构造函数
    val = x; 
    }
}


public class AddTwoNums {
	public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
		ListNode head=new ListNode(0);//头结点
		int s=0;//进位值
		ListNode temp;//游标指针
		temp=head;//游标指针指向头结点
		while(l1!=null||l2!=null) {//只要有一个不为空则按位加法就应该继续
			int x=(l1!=null) ? l1.val:0;//这里设置x、y代替l1.val,很好的解决了
			int y=(l2!=null) ? l2.val:0;//位数不相等的按位相加。如果为空则这一位补零
			temp.next=new ListNode((x+y+s)%10);//创建一个新的节点,val值为按位相加的值和进位值和求10的模,同时第一次head指针指向此节点
			s=(x+y+s)/10;//如果除十取整则为进位值,值更新
			temp=temp.next;//游标指针后移
			l1=(l1!=null) ? l1.next:null;//关键!!!这一步没有很容易出现空指针异常
			l2=(l2!=null) ? l2.next:null;//当位数不等时,如果不做判断,将出现空指针
		}if (s>0) {//在循环结束时进行判断如果进位值大于0则最高位相加发生了进位
			temp.next=new ListNode(s);//创建新节点,进位值
		}
		return head.next;//返回第一个节点
	}
	
	
	public static void main(String[] args) {
		ListNode _342 = new ListNode(2);
		_342.next = new ListNode(4);
		_342.next.next=new ListNode(3);
		
		ListNode _567 = new ListNode(7);
		_567.next = new ListNode(6);
		_567.next.next = new ListNode(5);
		
		 ListNode list=addTwoNumbers(_342, _567);
	while(list!=null) {
		System.out.print(list.val);
        if (list.next!=null) {
			System.out.print("->");
		}
		list=list.next;
	}
	}
}

延伸:

节点可以数组代替,可以类似的写出无穷大的数进行基本运算。数组按位存值,按位操作但是效率应该是很低(不建议使用)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值