轉載力扣逆序鏈表的兩個數進行相加

知識無價

初入力扣對鏈表的操作不熟悉,只是瞭解借鑑了別人優秀的代碼
我把一些地方編譯有錯的地方改了,下面是題目
在這裏插入圖片描述
通過的代碼

/**
 * 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* cur1 = l1; 
        ListNode* cur2 = l2;
        int count = 0;//每位之和
        int s = 0;//進位
        while(cur1->next !=NULL && cur2->next !=NULL){//加到其中有一個鏈表剩一位,或者兩個鏈表都只剩一位
            count = cur1->val + cur2->val + s;
            if(count > 9){
                cur1->val = count % 10 ;
                cur2->val = count % 10 ;
                s = 1;
            }else{
                cur1->val = count;
                cur2->val = count;
                s = 0;
            }
            cur1 = cur1->next;
            cur2 = cur2->next;   
        }
        if(cur1->next == NULL && cur2->next == NULL){ //當兩個鏈表都只剩一位時
            count = cur1->val + cur2->val +s;
            if(count > 9)
            {
                cur1->val = count % 10;
                cur2->val = count % 10;
                s = 1;
            }else{
                cur1->val = count ;
                cur2->val = count ;
                s = 0;
            }
            if(s == 1){  //說明最後兩個數產生了進位,需要擴充鏈表。
                ListNode* tmp = new ListNode(1);
                cur1->next = tmp;
                return l1;
            }
            return l1;
        }
        if(cur1->next == NULL){  //cur1鏈表剩一位
            count = cur1->val + cur2->val + s ;
            cur2->val = cur1->val + cur2->val;
            if(count < 10){  //cur1的最後一位加cur2的一位 沒產生進位,直接返回
                cur2->val = count;
                return l2;
            }
            while(cur2->next != NULL){  //因爲有進位,需要再把cur2的剩餘數計算 直到最後一位
               count =  cur2->val + s;
               if(count > 9){
                   cur2->val = count % 10 ;
                   s = 1;
               } else{
                   cur2->val = count;
                   s = 0;
               }
                cur2 = cur2->next;
            }
            if(cur2->val + s > 9){  //判斷cur2 最後一位是否產生進位
                cur2->val = (cur2->val + s) % 10;
                s = 1;
            }else{
                cur2->val = cur2->val +s;
                s = 0;
            }
            if(s == 1){  //產生進位,擴充鏈表
                ListNode* tmp = new ListNode(1);
                cur2->next = tmp;
                return l2;
            }
            return l2;
        }else{  //cur2鏈表剩一位
            count = cur1->val + cur2->val + s;
            cur1->val = cur2->val + cur1->val;
            if(count < 10){ //cur2的最後一位加cur1的一位 沒產生進位,直接返回
                cur1->val = count;
                return l1;
            }
            while(cur1->next != NULL){ //因爲有進位,需要再把cur1的剩餘數計算 直到最後一位
               count =  cur1->val + s;
               if(count > 9){
                   cur1->val = count % 10 ;
                   s = 1;
               } else{
                   cur1->val = count;
                   s = 0;
               }
                cur1 = cur1->next;
            }
            if(cur1->val + s > 9){  //判斷cur1 最後一位是否產生進位
                cur1->val = (cur1->val + s) % 10;
                s = 1;
            }else{
                cur1->val = cur1->val +s;
                s = 0;
            }
            if(s == 1){  //產生進位,擴充鏈表
                ListNode* tmp = new ListNode(1);
                cur1->next = tmp;
                return l1;
            }
        }
        return l1;
    }
};

原創來源
不得不承認別人的代碼真的很優秀
學習這條路人煙稀少,寸步難行……
卻又不得不去堅持!

在這裏插入圖片描述

發佈了84 篇原創文章 · 獲贊 108 · 訪問量 7920
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章