Java-LeetCode002
阿新 • • 發佈:2018-12-23
LeetCode002
question:
給出兩個非空的連結串列用來表示兩個非負的整數。其中,它們各自的位數是按照逆序的方式儲存的,並且它們的每個節點只能儲存一位數字。
如果,我們將這兩個數相加起來,則會返回一個新的連結串列來表示它們的和。
您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。
示例:
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807
answer:
1.出現空連結串列
啞節點dummy:啞節點的使用可以對程式碼起到簡化作用(省略當函式的入口引數為空時的判斷或者說是避免處理頭節點為空的邊界問題);
2.兩個連結串列不一樣長
利用()?():()三目運算子進行判斷,為空時取0;
3.溢位,進位的處理
由於9+9+1=19,所以進位值為0或者1,當進位值大於0時,產生溢位,要增加一位儲存溢位
示例:
輸入:(2 -> 4 -> 8) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 3 ->1
原因:842 + 465 = 1307
code:
//定義一個單鏈表 class ListNode { int val; ListNode next; ListNode(int x) { val = x; } } //計算兩數之和 public class AddTwoNumbers { //物件方法,引數為兩個連結串列 public ListNode addTwoNumbers(ListNode l1, ListNode l2) { ListNode dummyHead = new ListNode(0); // 啞結點,省略當函式的入口引數為空時的判斷 ListNode p = l1, q = l2, curr = dummyHead; int carry = 0; //儲存 進位 //當兩個連結串列並不全部為空時進行計算 while(p!=null || q!= null) { int x = (p!=null)?p.val:0; //取第一個連結串列的值 int y = (q!=null)?q.val:0; //取第二個連結串列的值 int sum = carry + x + y ; //兩個數字相加 carry = sum / 10; //計算進位 curr.next= new ListNode(sum % 10); //儲存低位 curr = curr.next; //指向下一個結點 //取下一個結點 if(p!=null) { p = p.next; } if(q!=null) { q = q.next; } } //判斷最高位是否還有進位 if(carry > 0) { curr.next =new ListNode(carry); } return dummyHead.next; //啞結點的next開始 } public static void main(String[] args) { //test ListNode l1 = new ListNode(2); l1.next = new ListNode(4); l1.next.next = new ListNode(3); ListNode l2 = new ListNode(5); l2.next = new ListNode(6); l2.next.next = new ListNode(4); AddTwoNumbers a = new AddTwoNumbers(); //呼叫本類物件方法,new一個物件 ListNode result = a.addTwoNumbers(l1,l2); while(result!=null) { System.out.print(result.val); if(result!=null) { result = result.next; } } } }