【鏈表】兩數相加

零、題目
給出兩個 非空 的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,並且它們的每個節點只能存儲 一位 數字。
如果,我們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。
您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭

/**

  • Definition for singly-linked list.
  • struct ListNode {
  • int val;
    
  • struct ListNode *next;
    
  • };
    */

一、閱讀題目
1 已知量:加法的兩個元素;
2 未知量:加法的結果;
3 條件:加法;

二、擬定方案
1 獲取加法中,每一位的分開的元素;
2 進位;
3 獲取每個節點的值;
4 插入節點,尾部插入;

三、code

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
    struct ListNode* head = (struct ListNode*)malloc(sizeof(struct ListNode));
    head->next = NULL;
    struct ListNode* tail = head;
    int carry = 0;
    int l1Val;
    int l2Val;
    while(l1 != NULL || l2 != NULL || carry!=0)
    {
        if(l1 == NULL)
        {
            l1Val = 0;
        }else
        {
            l1Val = l1->val;
        }
        if(l2 == NULL)
        {
            l2Val = 0;
        }else
        {
            l2Val = l2->val;
        }
        
        
        int sum = l1Val +l2Val + carry;
        carry = sum/10;
        struct ListNode* sumNode = (struct ListNode*)malloc(sizeof(struct ListNode));
        sumNode->val = sum%10;
        sumNode->next = NULL;
        tail->next = sumNode;
        tail = sumNode;
        
        if(l1 != NULL) l1 = l1->next;
        if(l2 != NULL) l2 = l2->next;
    }
    return head->next;
}

四、回顧
1 這裏的尾部插入,與上一個題中的尾部插入不一樣
1) 將當前節點的next值,賦值給新創建的節點,然後再將本節點給加上;
2)生成本節點信息,將該節點信息賦值給鏈表中最後一個節點,然後再將鏈表中最後一個指針更新爲當前節點;
3)區別有兩點,第一是是否繼承了上一次鏈表中,最後一個節點的next值,爲空或者爲零;選擇爲零的原因是,此處使用數組模擬鏈表,初始化的表示下一個值得數組,默認值都爲零;
2 當前遇到兩種題型,第一是在什麼位置插入該節點,第二個是順序插入,但是插入什麼樣的節點;
3 一般情況都是尾部插入的方式,以及第一個節點爲空;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章