LeetCode刷题之两数相加

两数相加(Add Two Numbers)

题目

AddTwoNumbers

代码



   /**
     * @ClassName AddTowNumbers
     * @Description TODO 两数相加$
     * @Author charlesYan
     * @Date 2020/3/10 15:15
     * @Version 1.0
     **/
     public class AddTowNumbers {

         //内部静态类
         public static class ListNode {

             private int val;

             private ListNode next;

             public ListNode(int x) {
                 this.val = x;
             }
         }



         public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
             //非空校验
             if (l1 == null && l2 == null) {
                 return null;
             }

             //初始化头节点
             ListNode dummyNode = new ListNode(0);
             //指针
             ListNode head = dummyNode;

             int addOne = 0;
             //判断l1、l2和addOne为空则跳出循环
             while (l1 != null || l2 != null || addOne != 0) {
                 int val1 = l1 == null ? 0 : l1.val;
                 int val2 = l2 == null ? 0 : l2.val;
                 int sum = val1 + val2 + addOne;

                 //取余
                 head.next = new ListNode(sum % 10);
                 //指针前进一位,获取最低层next地址
                 head = head.next;

                 //取整
                 addOne = sum/10;

                 //l1和l2前进一位
                 if (l1 != null) {
                     l1 = l1.next;
                 }
                 if (l2 != null) {
                     l2 = l2.next;
                 }

             }

             return dummyNode.next;
         }


         //打印字符串
         public static String printListNode(ListNode ln){
             StringBuffer sb = new StringBuffer();
             while (ln != null) {
                 sb.append(ln.val);
                 ln = ln.next;
             }
             return sb.toString();
         }


         //测试类
         public static void main(String[] args) {
             ListNode ln1 = new ListNode(2);
             ln1.next = new ListNode(4);
             ListNode ln2 = new ListNode(5);
             ln2.next = new ListNode(6);

             ListNode result = addTwoNumbers(ln1, ln2);
             System.out.println(printListNode(result));
         }
     }


官方解法

  • 解题思路

    思路

  • 算法

    算法

  • 特殊情况

    特殊情况

  • 源码


   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;
 }




  • 复杂度分析

时间复杂度:O(max(m, n))

假设 m 和 n 分别表示 l1 和 l2 的长度,上面的算法最多重复 max(m,n) 次。

空间复杂度:O(max(m,n))

新列表的长度最多为 max(m,n)+1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值