C++实现 LeetCode-2.Add Two Numbers

思路:

建立一个新链表,把输入的两个链表从左往右,每个节点相加,将和作为新节点添加至新链表后面,注意进位,最高位进位需要单独处理。

方法一:

/**
 * 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 *head  = (ListNode *)malloc(sizeof(ListNode));
        ListNode *pre = head;
        ListNode *node = NULL;
        
        int c =0 ,sum,val1,val2;
        
        while(l1 != NULL || l2 != NULL || c!=0){
            val1 = (l1 == NULL?0:l1->val );
            val2 = (l2 == NULL?0:l2->val);
            sum=val1+val2+c;
            c=sum/10;
            node = (ListNode *)malloc(sizeof(ListNode));
            node->val = sum%10;
            node->next = NULL;
            
            pre->next = node;
            pre=node;
            l1 = (l1 ==NULL?NULL:l1->next);
            l2 = (l2 ==NULL?NULL:l2->next);
        }
        return head->next;
    }
};

方法二:

/**
 * 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* pRoot = NULL;
        
        do {
            if (l1 == NULL) {
                pRoot = l2;
                break;
            } 
            
            if (l2 == NULL) {
                pRoot = l1;
                break;
            }
            
            int sum = l1->val + l2->val;
            int digit = sum % 10;
            int carry = sum / 10;
            pRoot = new ListNode(digit);
            ListNode* pTail = pRoot;
            l1 = l1->next;
            l2 = l2->next;

            while (l1 != NULL || l2 != NULL) {
                int sum = ((l1 != NULL) ? l1->val : 0) + ((l2 != NULL) ? l2->val : 0) + carry;
                int digit = sum % 10;
                carry = sum / 10;
                
                ListNode* pNew = new ListNode(digit);
                pTail->next = pNew;
                pTail = pNew;
                
                l1 = l1 != NULL ? l1->next : NULL;
                l2 = l2 != NULL ? l2->next : NULL;
            }
            
            if (carry == 1) {
                ListNode* pNew = new ListNode(carry);
                pTail->next = pNew;
            }
        } while (false);
        
        return pRoot;
    }
};

 

方法三:

/**
 * 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 *res = new ListNode(-1);
        ListNode *cur = res;
        int carry = 0;
        
        while(l1 || l2){
            int n1 = l1 ? l1->val:0;
            int n2 = l2 ? l2->val:0;
            int sum = n1+n2+carry;
            carry = sum/10;
            cur->next = new ListNode(sum%10);
            cur = cur->next;
            if(l1)
                l1=l1->next;
            if(l2)
                l2=l2->next;
        }
        if(carry) cur->next = new ListNode(1);
        return res->next;
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值