002LeetCode--TwoNumbers

Posted icodinglife

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了002LeetCode--TwoNumbers相关的知识,希望对你有一定的参考价值。

002TwoNumbers(将单链表表示的两个数进行相加)

学习LeetCode打卡第二天重要提示:原文出处在 DERRANTCM,感谢博主大大的无私分享),这篇博文主要记录自己的学习心得,2018年了,在此祝福大家学习进步,工作顺利!

下面先给出博主原文,然后在博主的代码基础上修改出可运行程序。

原题

  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 

题目大意

  有两个单链表,代表两个非负数,每一个节点代表一个数位,数字是反向存储的,即第一个结点表示最低位,最后一个结点表示最高位。求两个数的相加和,并且以链表形式返回。 

解题思路

  对两个链表都从第一个开始处理,进行相加,结果再除以10求商,作为下一位相加的进位,同时记录余数,作为本位的结果,一直处理,直到所有的结点都处理完。 

代码实现

public class TwoNumbers {
  private static class ListNode {
    public ListNode next = null;
    public int val=0;
    public ListNode(){
        
    }
    public ListNode (int val,ListNode n){
        this.val = val;
        this.next = n;
    }
    
    /**
     * 002-Add Two Numbers (单链表表示的两个数相加)
     * @param l1 第一个数
     * @param l2 第二个数
     * @return 结果
     */
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {

        if (l1 == null) {
            return l2;
        }

        if (l2 == null) {
            return l1;
        }

        ListNode p1 = l1;
        ListNode p2 = l2;
        
        ListNode root = new ListNode(-1,null); // 构造根节点,-1表示根节点
        ListNode r = root; 

        int val = 0;//本位值
        int carry = 0; // 初始进位
        int sum;
        
        while (p1 != null && p2 != null) {
            sum = p1.val + p2.val + carry;
            val = sum % 10; // 本次相加的结果
            carry = sum / 10; // 本次进位
        
            r.next = new ListNode(val,null);
            r = r.next; // 指向最后一个相加的结点
            p1 = p1.next;
            p2 = p2.next;

        }

        if (p1 == null) {
            p1 = p2;
        }  

        // 最后一次相加还有进位
        if (carry > 0) {
            // 开始时r.next是第一个要相加的结点
            while (p1 != null) {
                sum = p1.val + carry;
                val = sum % 10; // 本次相加的结果
                carry = sum / 10; // 本次进位
            
                r.next = new ListNode(val,null); 
                r = r.next;
                p1 = p1.next;
            }

            // 都加完了还有进位,就要创建一个新的结点
            if (carry >0 ) {
                r.next = new ListNode(carry,null);
            }
        }

        return root.next;
    }

    public void printVal(ListNode n){
        if (n!=null) {
            printVal(n.next);
            System.out.print(n.val);
        }         
    }
  }
    public static void main(String[] args) {
        String str1 = "97234";
        String str2 = "8766";
        System.out.println(str1+"+"+str2+"="+(Integer.parseInt(str1)+Integer.parseInt(str2)));
        char[] s1 =str1.toCharArray(); 
        char[] s2 = str2.toCharArray(); 
        ListNode node1 = new ListNode(-1,null);
        ListNode node2 = new ListNode(-1,null);
        ListNode n1 = node1;
        ListNode n2 = node2;
        for(int i = s1.length-1 ; i >= 0 ; i--){
            n1.next = new ListNode(Character.getNumericValue(s1[i]),null);
            n1 = n1.next; 
        }
        for(int i = s2.length -1  ; i >= 0; i--){
            n2.next = new ListNode(Character.getNumericValue(s2[i]),null);
            n2 = n2.next; 
        }
        ListNode ln =  new ListNode();
        ListNode result = ln.addTwoNumbers(node1.next,node2.next);
//输出结果 ln.printVal(result); } }

 







以上是关于002LeetCode--TwoNumbers的主要内容,如果未能解决你的问题,请参考以下文章

Unicode字符列表的代码显示与描述

002: NetBeans 的 代码补全

免费下载全套最新002JDBC视频教程+教学资料+学习课件+源代码+软件开发工具

Java ReEntrantLock 之 Condition条件(Java代码实战-002)

GolangStudy-002-HelloWorld

.7z.002怎样打开