兩數相加
1.題目描述
給出兩個 非空 的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,並且它們的每個節點只能存儲 一位 數字。
如果,我們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。
您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。
示例:
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807
2.思路
這是在用鏈表做加法,注意進位即可。考查的是鏈表的基礎知識,創建、遍歷鏈表。需要考慮鏈表爲空的情況。
3.解法
初次嘗試,使用此解法雖然解決了問題,但是代碼可讀性較差
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode head = new ListNode(0);
ListNode result = head;
do{
int nullTag = 0;
int increase = 0;
if(l1!=null){
result.val+=l1.val;
if(l1!=null)l1 = l1.next;
}else{
nullTag +=1;
}
if(l2!=null){
result.val+=l2.val;
if(l2!=null)l2 = l2.next;
}else{
nullTag +=1;
}
increase = result.val/10;
result.val = result.val%10;
if(nullTag==2){ //需要退出循環
if(increase!=0){
result.next = new ListNode(increase);
result = result.next;
}
return head;
}else{
if(l1==null&&l2==null&&increase==0){
continue;
}else{
result.next = new ListNode(increase);
result = result.next;
}
}
}while(true);
}
稍作優化如下:
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode head = new ListNode(0);
ListNode currentNode = head;
int curry=0; //進位
while(l1!=null||l2!=null||curry!=0){
if(l1!=null){
currentNode.val+=l1.val;
l1 = l1.next;
}
if(l2!=null){
currentNode.val+=l2.val;
l2 = l2.next;
}
curry = currentNode.val/10;
currentNode.val = currentNode.val%10;
if(l1!=null||l2!=null||curry!=0){//如果後續沒有操作數了,則不再進位,處理多0的情況
currentNode.next = new ListNode(curry);
currentNode = currentNode.next;
}
}
return head;
}
儘量讓代碼優雅,保持良好習慣!