题目:
您将获得两个非空链表,表示两个非负整数。数字以相反的顺序存储,每个节点包含一个数字。添加两个数字并将其作为链接列表返回。
您可以假设这两个数字不包含任何前导零,除了数字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;
}
}
}
延伸:
节点可以数组代替,可以类似的写出无穷大的数进行基本运算。数组按位存值,按位操作但是效率应该是很低(不建议使用)