转载力扣逆序链表的两个数进行相加
  6DMaaPzJglxt 2023年12月05日 28 0


知识无价

初入力扣对链表的操作不熟悉,只是了解借鉴了别人优秀的代码

我把一些地方编译有错的地方改了,下面是题目

转载力扣逆序链表的两个数进行相加_链表


通过的代码

/**
 * 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;
    }
};

不得不承认别人的代码真的很优秀

学习这条路人烟稀少,寸步难行……
却又不得不去坚持!

转载力扣逆序链表的两个数进行相加_链表_02


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年12月05日 0

暂无评论

推荐阅读
6DMaaPzJglxt