zoukankan      html  css  js  c++  java
  • cc150 Chapter 2 | Linked Lists 2.5 add two integer LinkedList, return LinkedList as a sum

    2.5 You have two numbers represented by a linked list, where each node contains a single digit. The digits are stored in reverse order, such that the 1’s digit is at the head of the list. Write a function that adds the two numbers and returns the sum as a linked list. EXAMPLE Input: (3 -> 1 -> 5) + (5 -> 9 -> 2) Output: 8 -> 0 -> 8

    给两个整型链表,每个节点包含一个位数,这些位数是反向存放的,也就是个位数在链表首部,编写程序,对这两个整数求和,并用链表形式返回结果。

    进阶:

    假设这些位数是正向存放的,请再做一遍。

    1.自己的思路是:取每个list的第一个,相加(随时取余,相除),放入新建一个列表的最后一个。

     1 public class newAdd5 {
     2     public static LinkedList<Integer> sum1(LinkedList<Integer> l1,
     3             LinkedList<Integer> l2) {
     4         LinkedList<Integer> l3 = new LinkedList<Integer>();
     5         if (l1.isEmpty())
     6             return l2;
     7         if (l2.isEmpty())
     8             return l1;
     9         int carry = 0;
    10         while (!l1.isEmpty() && !l2.isEmpty()) {
    11             int sum = 0;
    12             sum = (l1.peek() + l2.peek() + carry) % 10;
    13             carry = (l1.poll() + l2.poll() + carry) / 10;
    14             l3.addFirst(sum);
    15         }
    16         while (!l1.isEmpty() && l2.isEmpty()) {
    17             int sum = 0;
    18             sum = (l1.peek() + carry) % 10;
    19             carry = (l1.poll() + carry) / 10;
    20             l3.addFirst(sum);
    21         }
    22         while (!l2.isEmpty() && l1.isEmpty()) {
    23             int sum = 0;
    24             sum = (l2.peek() + carry) % 10;
    25             carry = (l2.poll() + carry) / 10;
    26             l3.addFirst(sum);
    27         }
    28         return l3;
    29 
    30     }
    31 
    32     // follow up
    33     public static LinkedList<Integer> sum2(LinkedList<Integer> l1,
    34             LinkedList<Integer> l2) {
    35         java.util.Collections.reverse(l1);
    36         java.util.Collections.reverse(l2);
    37         LinkedList<Integer> l3 = new LinkedList<Integer>();
    38         if (l1.isEmpty())
    39             return l2;
    40         if (l2.isEmpty())
    41             return l1;
    42         int carry = 0;
    43         while (!l1.isEmpty() && !l2.isEmpty()) {
    44             int sum = 0;
    45             sum = (l1.peek() + l2.peek() + carry) % 10;
    46             carry = (l1.poll() + l2.poll() + carry) / 10;
    47             l3.addFirst(sum);
    48         }
    49         while (!l1.isEmpty() && l2.isEmpty()) {
    50             int sum = 0;
    51             sum = (l1.peek() + carry) % 10;
    52             carry = (l1.poll() + carry) / 10;
    53             l3.addFirst(sum);
    54         }
    55         while (!l2.isEmpty() && l1.isEmpty()) {
    56             int sum = 0;
    57             sum = (l2.peek() + carry) % 10;
    58             carry = (l2.poll() + carry) / 10;
    59             l3.addFirst(sum);
    60         }
    61         return l3;
    62 
    63     }
    64 
    65     public static void main(String[] args) {
    66         Random rd = new Random();
    67         LinkedList<Integer> list1 = new LinkedList<Integer>();
    68         LinkedList<Integer> list2 = new LinkedList<Integer>();
    69         int n1 = rd.nextInt(5);
    70         for (int i = 0; i < n1; i++) {
    71             list1.add(rd.nextInt(10));
    72         }
    73         int n2 = rd.nextInt(6);
    74         for (int i = 0; i < n2; i++) {
    75             list2.add(rd.nextInt(10));
    76         }
    77         System.out.println(list1.toString());
    78         System.out.println(list2.toString());
    79         System.out.println("After Adding: ");
    80         System.out.println(sum1(list1, list2).toString());
    81         LinkedList<Integer> list3 = new LinkedList<Integer>();
    82         LinkedList<Integer> list4 = new LinkedList<Integer>();
    83         for (int i = 0; i < n1; i++) {
    84             list3.add(rd.nextInt(10));
    85         }
    86         for (int i = 0; i < n2; i++) {
    87             list4.add(rd.nextInt(10));
    88         }
    89         System.out.println("Follow Up: ");
    90         System.out.println(list3.toString());
    91         System.out.println(list4.toString());
    92         System.out.println(sum2(list3, list4).toString());
    93     }
    94 }

    然后在网上看的方法更简洁:

    public class Sum5 {
        public static void main(String[] args) {
            Random rd = new Random();
            LinkedList<Integer> list1 = new LinkedList<Integer>();
            LinkedList<Integer> list2 = new LinkedList<Integer>();
            int n1 = rd.nextInt(5);
            for (int i = 0; i < n1; i++) {
                list1.add(rd.nextInt(10));
            }
            int n2 = rd.nextInt(6);
            for (int i = 0; i < n2; i++) {
                list2.add(rd.nextInt(10));
            }
            System.out.println(list1.toString());
            System.out.println(list2.toString());
            System.out.println("After Adding: ");
            System.out.println(addReverse(list1, list2).toString());
            LinkedList<Integer> list3 = new LinkedList<Integer>();
            LinkedList<Integer> list4 = new LinkedList<Integer>();
            for (int i = 0; i < n1; i++) {
                list3.add(rd.nextInt(10));
            }
            for (int i = 0; i < n2; i++) {
                list4.add(rd.nextInt(10));
            }
            System.out.println("Follow Up: ");
            System.out.println(list3.toString());
            System.out.println(list4.toString());
            System.out.println(addForward(list3, list4).toString());
        }
    
        private static LinkedList<Integer> addReverse(LinkedList<Integer> list1,
                LinkedList<Integer> list2) {
            LinkedList<Integer> list3 = new LinkedList<Integer>();
            int sum = 0;
            while (!list1.isEmpty() || !list2.isEmpty() || sum != 0) {
                int tempsum = sum;
                if (!list1.isEmpty()) {
                    tempsum += list1.poll();
                }
                if (!list2.isEmpty()) {
                    tempsum += list2.poll();
                }
                list3.addFirst(tempsum % 10);
                sum = tempsum / 10;
            }
            return list3;
        }
    
        private static LinkedList<Integer> addForward(LinkedList<Integer> list1,
                LinkedList<Integer> list2) {
            LinkedList<Integer> list3 = new LinkedList<Integer>();
            int sum = 0;
            java.util.Collections.reverse(list1);
            java.util.Collections.reverse(list2);
            while (!list1.isEmpty() || !list2.isEmpty() || sum != 0) {
                int tempsum = sum;
                if (!list1.isEmpty()) {
                    tempsum += list1.poll();
                }
                if (!list2.isEmpty()) {
                    tempsum += list2.poll();
                }
                list3.addFirst(tempsum % 10);
                sum = tempsum / 10;
            }
            return list3;
        }
    }
  • 相关阅读:
    mojoportal中弹出窗口
    css 层居中
    mojoportal中添加自定义javascript
    C#执行cmd [转载]
    异步委托 学习笔记
    Windows Sysinternals
    有关int,Int32的疑惑解答
    WEB Debug tools汇总
    规范很重要
    [笔记]VGA 接口电阻网络阻抗
  • 原文地址:https://www.cnblogs.com/hewx/p/4492029.html
Copyright © 2011-2022 走看看