ACM之两数相加问题

Posted

tags:

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

题目如下:

技术分享图片

这道题个人觉得没涉及到什么算法,就是考数据结构——链表。那首先来简单复习一下链表:


     链表(Linked list)是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而顺序表相应的时间复杂度分别是O(logn)和O(1)。

技术分享图片

使用Java定义链表:

public static class ListNode{
          int data;
          ListNode next;
          ListNode(int x){
              data = x;
          }
}

    

    在这道题中,由于位数按照逆序存储,即链表的头结点就是个位,然后一次是十位、百位...,所以可以直接从头结点开始相加,只需要将进位保存下来加到下一位的和上即可。感觉这道题没什么可说的,自己做的时候就是对链表的操作不熟练,所以重点还是在数据结构上。

Java代码实现

package Leetcode;
import java.util.Random;
public class TwoPlusBter {
     
     // TODO create a listNode class
     public static class ListNode{
          int data;
          ListNode next;
          ListNode(int x){
              data = x;
          }
          // FOR i can output the ListNode with a String
          public String toString(){
              String res = "";
              for(ListNode p = this;p != null;p = p.next){
                   res += p.data + " ";
              }
              return res;
          }
          
          
     }
     
     public static ListNode Solution(ListNode l1,ListNode l2){
          ListNode res = new ListNode(0);
          ListNode cur = res;//cur作为res的引用,改变cur即改变res
          
          for(int carry = 0;l1 != null || l2 != null || carry > 0;){
              int val1 = l1 != null ? l1.data:0;
              int val2 = l2 != null ? l2.data:0;
              
              l1 = l1 != null ? l1.next:null;
              l2 = l2 != null ? l2.next:null;
              
              int sum = val1 + val2 + carry;//各位相加
              carry = sum / 10; //carry作为进位:0 or 1
              cur.next = new ListNode(sum % 10);
              cur = cur.next;
              //System.out.println("aaa");
              
          }
            res = res.next;
          //System.out.println("aaa");
          return res;
     }
     
     public static ListNode Random(){
          ListNode test = new ListNode(0);
          ListNode cur = test , del = null;
          Random rd = new Random();
          int n = rd.nextInt(9) + 1; //生成[0,9)的随机数
          System.out.println("n="+n);
          for(int i = 0;i<n;i++){
              cur.data = rd.nextInt(10);
              cur.next = new ListNode(0);
              del = cur; // del指向cur的前一个结点
              cur = cur.next;
              //这样的话跳出循环时cur会出现一个多余的结点,所以利用del将此结点删除
          }
          del.next = null;
          return test;
     }
     
     public static void main(String[] args){
          ListNode l1 = Random();
          System.out.println(l1.toString());
          ListNode l2 = Random();
          System.out.println(l2.toString());
          ListNode res = Solution(l1,l2);
          System.out.println(res.toString());
     }
}





























以上是关于ACM之两数相加问题的主要内容,如果未能解决你的问题,请参考以下文章

leetcode之两数相加解题思路

leetcode之两数相加解题思路

力扣之两数相加

力扣之两数相加

LeetCode之两数相加反转链表少箭射球二叉树

C语言之两数排序即两数交换值