LeetCode2. 两数相加

给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。

你可以假设除了数字 0 之外,这两个数字都不会以零开头。

 

实例:

输入:(2 -> 4 ->3)+(5 -> 6 ->4)

输出:7 -> 0 -> 8

原因:342+465=807

 

思路:

相加实际上是两个表的表头开始相加,这两个数都是0-9的数字,相加可能会进位,如5+7=12.这种情况我们将相加得到的数字的当前数值设置为2,并将进位carry=1带入到下一次。进位carry是0或者1.

伪代码:

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

 

代码:

 

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode list=new ListNode(0);
        ListNode p=l1,q=l2,curr=list;
        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 list.next;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值