LeetCode002
question:
给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
answer:
1.出现空链表
哑节点dummy:哑节点的使用可以对代码起到简化作用(省略当函数的入口参数为空时的判断或者说是避免处理头节点为空的边界问题);
2.两个链表不一样长
利用()?():()三目运算符进行判断,为空时取0;
3.溢出,进位的处理
由于9+9+1=19,所以进位值为0或者1,当进位值大于0时,产生溢出,要增加一位存储溢出
示例:
输入:(2 -> 4 -> 8) + (5 -> 6 -> 4)
输出:7 -> 0 -> 3 ->1
原因:842 + 465 = 1307
code:
//定义一个单链表
class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
//计算两数之和
public class AddTwoNumbers {
//对象方法,参数为两个链表
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode dummyHead = new ListNode(0); // 哑结点,省略当函数的入口参数为空时的判断
ListNode p = l1, q = l2, curr = dummyHead;
int carry = 0; //存储 进位
//当两个链表并不全部为空时进行计算
while(p!=null || q!= null) {
int x = (p!=null)?p.val:0; //取第一个链表的值
int y = (q!=null)?q.val:0; //取第二个链表的值
int sum = carry + x + y ; //两个数字相加
carry = sum / 10; //计算进位
curr.next= new ListNode(sum % 10); //存储低位
curr = curr.next; //指向下一个结点
//取下一个结点
if(p!=null) {
p = p.next;
}
if(q!=null) {
q = q.next;
}
}
//判断最高位是否还有进位
if(carry > 0) {
curr.next =new ListNode(carry);
}
return dummyHead.next; //哑结点的next开始
}
public static void main(String[] args) {
//test
ListNode l1 = new ListNode(2);
l1.next = new ListNode(4);
l1.next.next = new ListNode(3);
ListNode l2 = new ListNode(5);
l2.next = new ListNode(6);
l2.next.next = new ListNode(4);
AddTwoNumbers a = new AddTwoNumbers();
//调用本类对象方法,new一个对象
ListNode result = a.addTwoNumbers(l1,l2);
while(result!=null) {
System.out.print(result.val);
if(result!=null) {
result = result.next;
}
}
}
}