1. 程式人生 > >ACM之兩數相加問題

ACM之兩數相加問題

ACM 兩數相加 Lee天Code

題目如下:

技術分享圖片

這道題個人覺得沒涉及到什麽算法,就是考數據結構——鏈表。那首先來簡單復習一下鏈表:


鏈表(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之兩數相加問題