Leetcode-2 兩數相加
阿新 • • 發佈:2020-07-28
2.兩數相加
題目說明
給出兩個 非空 的連結串列用來表示兩個非負的整數,其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。
如果,我們將這兩個數相加起來,則會返回一個新的連結串列來表示它們的和。
您可以假設除數字0之外,這兩個數都不會以0開頭。
示例:
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807
函式形式:
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { } }
開始的思路::
同時遍歷兩個連結串列,獲取兩個連結串列對應結點的值val,取和後作為要返回的新的連結串列的對應結點的val,要注意的是,val要判斷是否超過了10,假如超過了10要進行進位。當發現兩個連結串列指向都為空的時候,結束遍歷,返回新的連結串列。
思路中的錯誤:
1.首先既然val要判斷是否超過了10,可以發生進位,那麼在進行計算的時候應該將兩個連結串列的值和count進位的值的和作為新的連結串列的對應的val。
2.其次,當發現兩個連結串列皆為空時結束迴圈也是錯誤的,因為假如存在進位'count = 1',那麼結束迴圈,這個count直接不存在的了,所以還要判斷count的值是否為0,來作為遍歷結束的標誌。
3.(這點談不上是錯誤,像是不知道的總結)首先是關於結構體的定義,可以這樣寫ListNode *head = new ListNode(-1)
int a(0)
,這些是我以前是不知道的。4.還有在提交的時候,給出了這樣一個例子
輸入:0,0
輸出: 0
雖然題目寫著兩個連結串列都不以0開頭,但是還是給出這樣的一個例子,為了得到正確的結果,所以我將while結束的判定條件移到了開始的部分,不再檢測p -> next是否為NULL,而是檢測p是否為NULL。
提交程式碼:
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { ListNode *p,*q,*g; ListNode *l3 = new ListNode(-1); p = l1; q = l2; g = l3; int num1, num2; num1 = num2 = 0; int sum = 0; int count = 0; bool flag = true; while(flag){ if(p == NULL && q == NULL){ if(count == 0){ flag = false; break; } } if(p != NULL){ num1 = p -> val; p = p -> next; } if(q != NULL){ num2 = q -> val; q = q -> next; } if((num1 + num2 + count) < 10){ sum = num1 + num2 + count; count = 0; } else{ sum = num1 + num2 + count- 10; count = 1; } num1 = num2 = 0; g -> next = new ListNode(sum); g = g -> next; } g -> next = NULL; return l3->next; } };
還有一種思路是讓兩個連結串列長度保持一致,較短的那一個進行補零的操作,明天我看明白了再補上。
whitor0428於2020/07/28
喜歡可以點贊
歡迎評論