leetcode算法第二题

问题:You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.

Input: (2 -> 4 -> 3) + (5 -> 6 -> 4) Output: 7 -> 0 -> 8

解答:

  1. 其实题目的要求是(以额外例子为例):1+8=9,放入输出链表的第一个结点;5+5=10,放入第二个结点,产生进位;1放入第三个结点。
  2. 返回的要求是第一个结点,那么就需要2个指针,一个用来操作,一直next,一个始终指向第一个结点,用于return
  3. 需要一个进位的标志位carry,而且没有必要用boolean型的,用int型的更好,可以初始值赋值0,下一次的carry=(num1+num2+carry)/10
  4. 因为可能出现2个输入链表长短不一致的情况,当前结点为null时,赋值0就行了。
  5. 引入头结点的概念,因为初始的结点需要赋值,如果初始化为第一个结点的时候,会把大部分循环里的事情先拉出来做一遍,这样代码就会显得很繁琐,引入头结点可以避免这种情况,return的时候记得head.next。
  6. 循环退出条件是两个链表当前结点全是null,在退出循环之后需要判断进位的标志位carry,因为可能会多产出一位。
  7. 对方法进行入参检查是一个好习惯,但是本方法即使没有入参检查(输入2个null),也不会出错,只会返回null,那就不必写了。

 

代码:

public static ListNode addTwoNumbers(ListNode l1, ListNode l2)     {         // 头结点         ListNode head = new ListNode(0), operNode = head;         // 进位标志         int carry = 0;         while (l1 != null || l2 != null) {             int num1 = l1 == null ? 0 : l1.val;             int num2 = l2 == null ? 0 : l2.val;             int sum = num1 + num2 + carry;             operNode.next = new ListNode(sum % 10);             carry = sum / 10;             operNode = operNode.next;             l1 = l1 == null ? null : l1.next;             l2 = l2 == null ? null : l2.next;         }         // 最后一次相加之后判断标志位         if (carry == 1) {             operNode.next = new ListNode(1);         }         return head.next;     }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值