LeetCode 问题二和链表版本C++

问题描述

我正在做 LeetCode 问题 2 相加两个数字。说明是:

给你两个非空链表,代表两个非负链表 整数。数字以相反的顺序存储,并且它们的每个 节点包含一个数字。将两个数字相加并返回总和 作为链表。

你可以假设这两个数字不包含任何前导零,除了 数字 0 本身。

示例:

输入:l1 = [2,4,3],l2 = [5,6,4]

输出:[7,8]

解释:342 + 465 = 807。

注意两个链表的长度可以不同

我的想法是将 l1 和 l2 中的每个数字求和,称为 v3。将其修改 10 (v3%10) 以找出我需要插入到新链表中的数字。并将其除以 10 以确定我是否需要遇到进位。但是,我的解决方案没有返回任何内容,我不知道为什么...

 /**
 * 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 *dummy = NULL;
        int v3 = 0;
        int carry = 0;
        
        while (l1 && l2  && v3 > 0){
            int v1 = l1->val;
            int v2 = l2->val;
            
            // when l1 reaches the end. Set v1 to 0
            if(l1->next == NULL){
                v1 = 0;
            }
            if(l2->next == NULL){
                v2 = 0;
            }
            
            v3 = (v1 + v2 + carry);
            carry = v3 / 10;
            int insert_value = v3 % 10;
            
            ListNode *newNode = new ListNode(insert_value);
            
            if(dummy == NULL){
                dummy = newNode;
            } else {
                ListNode *head = dummy;
                while (dummy->next){
                    dummy = dummy->next;
                    
                    dummy->next = newNode;
                    dummy = head;
                }
            }
            
            if(l1->next != NULL){
                l1 = l1->next;
            }
            if(l2->next != NULL){
                l2 = l2->next;
            }
        }
        return dummy;
    }
};

解决方法

你的循环条件不太正确,应该是这样的:

ListNode *r = nullptr;
ListNode **curr = &r;
bool carry = false;
while( l1 || l2 || carry ) {
    int v = carry;
    if( l1 ) {
        v += l1->val;
        l1 = l1->next;
    }
    if( l2 ) {
         v += l2->val;
         l2 = ;2->next;
    }
    carry = v >= 10;
    (*curr)->next = new ListNode( v % 10 );
    curr = &(*curr)->next;
}

我没有测试这段代码,但思路应该很清楚

,

@奴隶 好,知道了。不得不尝试指针。但它确实奏效了。谢谢!

class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1,ListNode* l2) {
        ListNode *node = NULL;
        ListNode **cur = &node;
        bool carry = false;
        while(l1 || l2 || carry){
            int val = carry;
            if(l1){
                val += l1->val;
                l1 = l1->next;
            }
            if(l2){
                val += l2->val;
                l2 = l2->next;
            }
            carry = val >= 10;
            *cur = new ListNode(val%10);
            cur = &((*cur)->next);
        }
        return node;

    }
};