LeetCode第二题

LeetCode每日刷题

题目:两数相加(点这儿看原题o)
描述:给出两个非空的链表用来表示两个非负的整数。其中.它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储一位 数字。

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8

例:
LeetCode第二题_第1张图片
思考:

如两数相加个位满十往十位累加一,两个链表逆序则可以从左往右相加。增添变量carry 当carry=0,则意味着相加没有“溢出”(>10),当carry=1,则“溢出”。下一结点相加时+carry,从左至右递推。

伪代码如下:

将当前结点初始化为返回列表的哑结点。
将进位 carrycarry 初始化为 0。
将 pp 和 qq 分别初始化为列表 l1l1 和 l2l2 的头部。
遍历列表 l1l1 和 l2l2 直至到达它们的尾端。
将 xx 设为结点 pp 的值。如果 pp 已经到达 l1l1 的末尾,则将其值设置为 00。
将 yy 设为结点 qq 的值。如果 qq 已经到达 l2l2 的末尾,则将其值设置为 00。
设定 sum = x + y + carrysum=x+y+carry。
更新进位的值,carry = sum / 10carry=sum/10。
创建一个数值为 (sum \bmod 10)(summod10) 的新结点,并将其设置为当前结点的下一个结点,然后将当前结点前进到下一个结点。
同时,将 pp 和 qq 前进到下一个结点。
检查 carry = 1carry=1 是否成立,如果成立,则向返回列表追加一个含有数字 11 的新结点。
返回哑结点的下一个结点。

测试用例 说明
l1=[0,1],l2=[0,1,2]l2=[0,1,2] 当一个列表比另一个列表长时
l1=[],l2=[0,1]l2=[0,1] 当一个列表为空时,即出现空列表
l1=[9,9],l2=[1]l2=[1] 求和运算最后可能出现额外的进位

JAVA实现

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;        
        //“溢出”数值 如:sum=11时 carry=1;sum=21时 carry=2
        //即实现满十进一递增给下一位
        curr.next = new ListNode(sum % 10);//新节点的值 如sum=11 curr=1
        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;
}


你可能感兴趣的:(每日刷题)