两数之和
(1)给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
解题思路:遍历链表依次相加(遍历链表利用非空,.next进行指针移动)
注意问题:(1)链表为空的时候,数值为0 (2)carry数值是/不是取余,10+9=19,表示的进位,sum代表的数值的个位需要取余运算(3)当链表长度不一样的时候,最后可能发生进位。1+9=10的情况;
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
// 创建一个ListNode用来返回和的链表
ListNode head = new ListNode(0);
//p->l1链表的头部,代表链表的index 表示链表的实时位置
ListNode p = l1 , q = l2,current = head;
int carry = 0; //代表进位的位数;
//遍历链表,由于链表的长度不确定,所以||确定每个链表都可以遍历万,避免链表长度不一致;
while(p!=null || q!=null){
//不为空的时候取出链表的数值,当链表到达底部的时候有一个链表可能为空,数值为0;
int x = (p!=null)?p.val:0;
int y = (q!=null)?q.val:0;
int sum = (x+y+carry)%10; //sum的和等于两数的和, 7+8 = 15 只留下5 其余的进位
carry = (x+y+carry)/10; //carry和放在后面更新,首次的时候carry数值为0,15/10=1.5 进位进1,10+9=19/10 =1,9/10=0;
current.next = new ListNode(sum); //sum数值存入到链表里面,
current= current.next;
//指针指向下一个位置
if(p!=null) p = p.next;
if(q!=null) q = q.next;
}
//遍历万的数值;
if (carry > 0) { //考虑最后链表遍历玩还有数值的情况
current.next = new ListNode(carry);
}
return head.next;
}
}

浙公网安备 33010602011771号