1. 程式人生 > 實用技巧 >Leetcode-2 兩數相加

Leetcode-2 兩數相加

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

喜歡可以點贊
歡迎評論