5.两数相加

题目描述

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

示例

输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.

分析

  1. 这个就是模拟逐位相加,然后注意进位。
  2. 注意最后一个进位要添加一个节点。

上代码

/**
 * 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* out = NULL;
        ListNode** pout = &out; //注意用二级指针进行内存开辟和迭代才不会出错
        ListNode* p1 = l1;
        ListNode* p2 = l2;
        int result=0;
        while(p1 != NULL || p2 != NULL)
        {
    
    
            *pout = new ListNode;   
            if(p1 != NULL)
            {
    
    
                result += p1->val;
                p1 = p1->next;
            }
            if (p2 != NULL)
            {
    
    
                result += p2->val;
                p2 = p2->next;
            }
             
           
             if(result  > 9)
            {
    
    
                (*pout)->val = result - 10;
                result = 1;
            }else
            {
    
    
                (*pout)->val = result;
                result = 0;
            }           
            pout = &((*pout)->next);           

        }
      	
      	//注意最后一个节点的添加
        if(result != 0)
        {
    
    
            *pout = new ListNode; 
            (*pout)->val = result;
        }
        
        return out;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_16952303/article/details/121025774