【问题标题】:LeetCode question. Two Sum linked list version C++LeetCode 问题。两个 Sum 链表版本 C++
【发布时间】:2021-05-09 04:27:28
【问题描述】:

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

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

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

例子:

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

输出:[7,0,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;
    }
};

【问题讨论】:

  • 您是否使用调试器单步调试过您的代码?
  • v3 最初为 0,因此 v3 > 0 不成立,循环永远不会运行。
  • 循环条件应该是while( l1 || l2 || carry ) 而不是and
  • @StephenNewell 我试着这样做。但是 LeetCode 并没有提示我一个常规的控制台来单步执行代码。
  • @Slava 谢谢。我刚刚修好了。现在我陷入了一个无限循环,感觉第二个while循环没有break条件

标签: c++ data-structures linked-list


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-11
      • 2022-12-14
      • 1970-01-01
      • 2021-08-20
      相关资源
      最近更新 更多