LeetCode 445. Add Two Numbers II

这道题有两种解法:

  1. 利用栈的先进后出原则实现加法,将链表数据入栈,栈顶为低位。这里采用头插法(新的node插在前面)来使链表逆序。
    /**
     * 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) {
            Stack<Integer> stack1 = new Stack();
            Stack<Integer> stack2 = new Stack();
            while(l1 != null){
                stack1.push(l1.val);
                l1 = l1.next;
            }
            while(l2 != null){
                stack2.push(l2.val);
                l2 = l2.next;
            }
            int carry = 0;
            ListNode head = null;
            while(!stack1.isEmpty() || !stack2.isEmpty() || carry > 0){
                int sum = carry;
                if(!stack1.isEmpty()){
                    sum += stack1.pop();
                }
                if(!stack2.isEmpty()){
                    sum += stack2.pop();
                }
                ListNode d = new ListNode(sum % 10);
                carry = sum / 10;
                d.next = head;
                head = d;
            }
            return head;
        }
    }

     

  2. 先reverse两个list,然后逐位相加,再reverse得到的list,这就是我们想要的结果·。
    /**
     * 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 r1 = reverse(l1);
            ListNode r2 = reverse(l2);
            ListNode dummy = new ListNode();
            ListNode digit = dummy;
            int carry = 0;
            while(r1 != null || r2 != null){
                int sum = carry;
                if(r1 != null){
                    sum += r1.val;
                    r1 = r1.next;
                }
                if(r2 != null){
                    sum += r2.val;
                    r2 = r2.next;
                }
                digit.next = new ListNode(sum % 10);
                digit = digit.next;
                carry = sum / 10;
            }
            if(carry > 0){
                digit.next = new ListNode(1);
            }
            return reverse(dummy.next);
        }
        private ListNode reverse(ListNode head){
            ListNode prev = null;
            ListNode curr = head;
            while(curr != null){
                ListNode next = curr.next;
                curr.next = prev;
                prev = curr;
                curr = next;
            }
            return prev;
        }
    }

     

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值