码迷,mamicode.com
首页 > 其他好文 > 详细

445. Add Two Numbers II - Medium

时间:2018-12-15 10:28:30      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:cannot   ||   元素   style   other   time   for   div   exce   

You are given two non-empty linked lists representing two non-negative integers. The most significant digit comes first and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.

You may assume the two numbers do not contain any leading zero, except the number 0 itself.

Follow up:
What if you cannot modify the input lists? In other words, reversing the lists is not allowed.

Example:

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

 

 

M1: 先把两个链表反转,相加之后再反转

time: O(n), space: O(n)

/**
 * 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 dummy = new ListNode(0);
        ListNode prehead = dummy;
        int remainder = 0;
        ListNode p1 = reverse(l1), p2 = reverse(l2);
        while(p1 != null || p2 != null) {
            int sum = remainder;
            if(p1 != null) {
                sum += p1.val;
                p1 = p1.next;
            }
            if(p2 != null) {
                sum += p2.val;
                p2 = p2.next;
            }
            dummy.next = new ListNode(sum % 10);
            remainder = sum / 10;
            dummy = dummy.next;
        }
        if(remainder != 0) {
            dummy.next = new ListNode(remainder);
        }
        ListNode res = reverse(prehead.next);
        return res;
    }
    
    private ListNode reverse(ListNode head) {
        ListNode prev = null, cur = head;
        while(cur != null) {
            ListNode nextnode = cur.next;
            cur.next = prev;
            prev = cur;
            cur = nextnode;
        }
        return prev;
    }
}

 

M2: follow-up 不能反转链表

用两个stack分别存储链表元素,再相加。

注意如果相加的话,得到的结果是反的,所以在相加的时候,就要边反转此结果链表

detail: 把dummy的值设为sum%10,tmp是新节点,其值为carry,tmp指向dummy,然后dummy向前移动一位,即dummy = tmp

最后还要判断一下leading number是不是0,如果为0,则返回下一个节点

time: O(n), space: O(n)

/**
 * 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) {
        Stack<Integer> s1 = new Stack<>();
        Stack<Integer> s2 = new Stack<>();
        while(l1 != null) {
            s1.push(l1.val);
            l1 = l1.next;
        }
        while(l2 != null) {
            s2.push(l2.val);
            l2 = l2.next;
        }
        
        ListNode dummy = new ListNode(0);
        int carry = 0;
        while(!s1.isEmpty() || !s2.isEmpty()) {
            int sum = carry;
            if(!s1.isEmpty()) {
                sum += s1.pop();
            }
            if(!s2.isEmpty()) {
                sum += s2.pop();
            }
            dummy.val = sum % 10;
            carry = sum / 10;
            ListNode tmp = new ListNode(carry);
            tmp.next = dummy;
            dummy = tmp;
        }
        return dummy.val == 0 ? dummy.next : dummy;
    }
}

 

445. Add Two Numbers II - Medium

标签:cannot   ||   元素   style   other   time   for   div   exce   

原文地址:https://www.cnblogs.com/fatttcat/p/10122443.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!