ACM之兩數相加問題
阿新 • • 發佈:2018-04-23
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之兩數相加問題