2. 两数相加 - LeetCode

2. 两数相加

题目链接

直接解法

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode ans = null;
        ListNode p1 = l1, p2 = l2, p3 = null;
        int c = 0;
        while(p1 != null && p2 != null){
            if(p3 == null){
                ans = new ListNode();
                p3 = ans;
            }
            else{
                p3.next = new ListNode();
                p3 = p3.next;
            }
            p3.val = (p1.val + p2.val + c) % 10;
            c = (p1.val + p2.val + c) / 10;
            p1 = p1.next;
            p2 = p2.next;
        }
        while(p1 != null){
            p3.next = new ListNode();
            p3 = p3.next;
            p3.val = (p1.val + c) % 10;
            c = (p1.val + c) / 10;
            p1 = p1.next;
        }
        while(p2 != null){
            p3.next = new ListNode();
            p3 = p3.next;
            p3.val = (p2.val + c) % 10;
            c = (p2.val + c) / 10;
            p2 = p2.next;
        }
        if(c != 0){
            p3.next = new ListNode();
            p3 = p3.next;
            p3.val = c;
        }
        return ans;
    }
}

简单讲就是逐位相加,判断进位。

注意的点

  1. 两个数长度可能不同
  2. 最后可能会多一位进位
  3. java的对象new出来就回不去了

简短写法

/**
 * 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 root = new ListNode(0);
        ListNode cursor = root;
        int carry = 0;
        while(l1 != null || l2 != null || carry != 0) {
            int l1Val = l1 != null ? l1.val : 0;
            int l2Val = l2 != null ? l2.val : 0;
            int sumVal = l1Val + l2Val + carry;
            carry = sumVal / 10;
            
            ListNode sumNode = new ListNode(sumVal % 10);
            cursor.next = sumNode;
            cursor = sumNode;
            
            if(l1 != null) l1 = l1.next;
            if(l2 != null) l2 = l2.next;
        }
        
        return root.next;
    }
}

评论区抄的,代码比较短,只有一个while,用三目运算符来判断两个数有没有到头,进位是否为0 ,感觉会慢一些。但都是100以内的数,最多3位,无所谓了。

posted @ 2021-01-15 11:51  一天到晚睡觉的鱼  阅读(76)  评论(0)    收藏  举报