博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Add Two Numbers
阅读量:4942 次
发布时间:2019-06-11

本文共 2531 字,大约阅读时间需要 8 分钟。

package cn.edu.xidian.sselab;

import java.util.ArrayList;
/**
 * title:Add Two Numbers
 * content:
 * 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
 */
public class AddTwoNumbers {
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        AddTwoNumbers atn = new AddTwoNumbers();
        
        ListNode l1 = atn.new ListNode(5);
        ListNode l2 = atn.new ListNode(5);
        ListNode ls = AddTwoNumbers.addTwoNumbers(l1, l2);
        System.out.println(ls.val);
        System.out.println(ls.next.val);
    }
    class ListNode{
        int val;
        ListNode next;
        public ListNode(int x){
            val = x;
        }
    }
    
    //自己的思路,一开始:定义一个ListNode对象,让他指向l1,结果发现l1在不断的变化,这个对象也跟着一起到了队尾,然后就发现通过这种
    //这种指向方法而不创建对象来做是不可行的
    //接下来换了第二种思路,没加一次就创建一个保存和的对象,然后把这些对象都放到List容器里面,最后建立对象之间的链表关系,拿出第一个对象
    //作为返回值就可以了。
    //这里用到了数据结构里面最基本的方法,三个while循环,加一个判断最后一个节点根据进位值要不要新建
    public static ListNode addTwoNumbers(ListNode l1,ListNode l2){
        int temp = 0;
        int trade = 0;
        int tail = 0;
        ArrayList<ListNode> arr = new ArrayList<ListNode>();
        while(l1 != null && l2 != null){
            temp = l1.val + l2.val + trade;
            tail = temp % 10;
            trade = temp / 10;
            AddTwoNumbers atn = new AddTwoNumbers();
            ListNode ll = atn.new ListNode(tail);
            arr.add(ll);
            l1 = l1.next;
            l2 = l2.next;
        }
        while(l1 != null){
            temp = l1.val + trade;
            tail = temp % 10;
            trade = temp / 10;
            AddTwoNumbers atn = new AddTwoNumbers();
            ListNode ll = atn.new ListNode(tail);
            arr.add(ll);
            l1 = l1.next;
        }
        while(l2 != null){
            temp = l2.val + trade;
            l1 = l2;
            tail = temp % 10;
            trade = temp / 10;
            AddTwoNumbers atn = new AddTwoNumbers();
            ListNode ll = atn.new ListNode(tail);
            arr.add(ll);
            l2 = l1.next;
        }
        if(trade != 0){
            AddTwoNumbers atn = new AddTwoNumbers();
            ListNode last = atn.new ListNode(trade);
            arr.add(last);
            l1 = last;
        }
        int len = arr.size();
        for(int i=0;i<len-1;i++){
            arr.get(i).next = arr.get(i+1);
        }
        return arr.get(0);
        
    }
    
    //参考别人的思路,通过直接新建一个链,思路非常明确,而且很巧妙,将我原来的三个while循环合并成一个循环了。
    public ListNode addTwoNumber(ListNode l1,ListNode l2){
        ListNode result = new ListNode(0);
        ListNode temp = result;
        int sum = 0;
        while(l1 != null || l2 != null){
            sum /= 10;
            if(l1 != null){
                sum += l1.val;
                l1 = l1.next;
            }
            if(l2 != null){
                sum += l2.val;
                l2 = l2.next;
            }
            temp.next = new ListNode(sum % 10);
            temp = temp.next;
        }
        if(sum / 10 == 1){
            temp.next = new ListNode(1);
        }
        return result.next;
    }
    
}

转载于:https://www.cnblogs.com/wzyxidian/p/4937559.html

你可能感兴趣的文章
剑指Offer--二叉树的镜像
查看>>
PAT-BASIC-1031-查验身份证
查看>>
Python笔记5----集合set
查看>>
连连看小游戏
查看>>
js二级联动
查看>>
谜题32:循环者的诅咒
查看>>
RMI
查看>>
动态切换多数据源的配置
查看>>
win7电脑调整分区后分区不见的文件寻回法子
查看>>
《第一行代码》学习笔记2-Android开发特色
查看>>
bzoj3396 [Usaco2009 Jan]Total flow 水流
查看>>
20165231 2017-2018-2 《Java程序设计》第3周学习总结
查看>>
(180905)如何通过梯度下降法降低损失----Google机器学习速成课程笔记
查看>>
(响应式PC端媒体查询)电脑屏幕分辨率尺寸大全
查看>>
Crystal Reports拉报表报错:Error detected by database DLL
查看>>
Java获取新浪微博cookies
查看>>
面试题总结
查看>>
【BZOJ1095】捉迷藏(动态点分治)
查看>>
Table Basics [转载]
查看>>
Logback 学习笔记
查看>>