【LeetCode2】-两数相加

实现思路

一、遍历两个链表,使用一个sum来记录进位的情况
新节点t
t->val=(l1->val+l2->val+sum)%10
新计算的sum
(l1->val+l2->val+sum)/10

二、当同时遍历完之后,有一个链表不为空时,将该链表和进位进行运算依次得到新节点

三、在之前两步操作之后判断进位是否为1,如果为1,新创建一个节点值为1添加到新链表的最后

实现代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
    
    
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
    
    
        ListNode *pre,*head;
        int flag=0,sum=0;
        while(l1!=nullptr&&l2!=nullptr){
    
    
            ListNode *t=new ListNode();
            t->val=(l1->val+l2->val+sum)%10;
            sum=(l1->val+l2->val+sum)/10;

            if(!flag){
    
    
                head=t;
                flag=1;
            }
            else 
                pre->next=t;
            pre=t;
            l1=l1->next;
            l2=l2->next;
        }
        while(l1!=nullptr){
    
    
            ListNode *t=new ListNode();
            t->val=(l1->val+sum)%10;
            sum=(l1->val+sum)/10;
            pre->next=t;
            pre=t;
            l1=l1->next;
        }
        while(l2!=nullptr){
    
    
            ListNode *t=new ListNode();
            t->val=(l2->val+sum)%10;
            sum=(l2->val+sum)/10;
            pre->next=t;
            pre=t;
            l2=l2->next;
        }
        if(sum){
    
    
            ListNode *t=new ListNode(1,nullptr);
            pre->next=t;
        }
        return head;
    }
};

在这里插入图片描述

提交结果及分析

在这里插入图片描述

在这里插入图片描述

总结

思想是相同的,不同点在于头结点的处理,第二个的相当于是多设置了一个哨兵节点,这样的好处在于接下来的操作便于一致化处理,否则需要像我第一个代码需要额外有个flag来处理,而且第二个的代码更加简洁,减少了不必要的代码冗余

猜你喜欢

转载自blog.csdn.net/weixin_44944046/article/details/113092975