当前位置: 首页 > 知识库问答 >
问题:

LeetCode问题。二和链表C版

陶博赡
2023-03-14

我在做LeetCode问题2,加两个数字。说明如下:

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

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

示例:

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

输出:[7,0,8]

说明:342465=807。

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

我的想法是把l1和l2的每个数字相加,称之为v3。将其修改为10(v3),以找出我需要插入到新链表中的数字。把它除以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;
    }
};

共有2个答案

叶建柏
2023-03-14

@奴隶好的知道了。必须尝试指针。但它确实起作用了。谢谢你!

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;

    }
};
戴靖
2023-03-14

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

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

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

 类似资料:
  • 1. 找出两个链表的交点 2. 链表反转 3. 归并两个有序的链表 4. 从有序链表中删除重复节点 5. 删除链表的倒数第 n 个节点 6. 交换链表中的相邻结点 7. 链表求和 8. 回文链表 9. 分隔链表 10. 链表元素按奇偶聚集 链表是空节点,或者有一个值和一个指向下一个链表的指针,因此很多链表问题可以用递归来处理。 1. 找出两个链表的交点 160. Intersection of T

  • 我有一个关于python中链接列表的快速问题。在下面显示的解决方案代码中,当我尝试合并两个排序的链接列表时。我对包含的if和elif语句的条件感到困惑。例如,如果l1不为空,l2为空,我想将l1中的其余3个元素添加到我的新链接列表中,但代码显示l1和tail没有更新,所以它不是只添加3个元素中的一个吗? 我的另一个问题是关于返回head.next.返回会自动返回从head.next到null pt

  • 我对C模板非常陌生。我目前正在做一个项目,我需要使用模板实现双重链接列表。以下是我目前所拥有的: 然而,在我的析构函数中,为什么我不能访问节点元素?该方法中的代码现在已编译,但不会抛出错误。但是如果我尝试使用- 此外,我如何在函数头中初始化list==NULL,而不是在类之外进行初始化?

  • 广义表:(A(B(,D(E,F)),C)) 按广义表表示二叉树结构生成二叉链表的算法 BinTNode CreateTree (char str) { //str为存储广又表的按广义表表示二叉树结构生成二叉链表的算法符串的指针 BinTNode *St [100];. //用指针数组模拟栈 BinTNode *p=NULL; int top, k, j=0; top=-1; //置空栈 char

  • 我正在尝试使用回溯来解决LeetCode中的二进制手表问题。 我的代码在下面(不起作用) 我在leetcode讨论页面中找到了下面的代码(C),它运行良好。 上面的c algo和我写过的很像。但是我的代码不起作用。有人能解释一下我错过了什么吗? 我没有传递start Index,而是删除了该元素。但是为什么我的代码不起作用呢? 我尝试打印调用的堆栈跟踪,当然两者都非常不同。任何人都可以指出我错过了

  • 1. 求开方 2. 大于给定元素的最小元素 3. 有序数组的 Single Element 4. 第一个错误的版本 5. 旋转数组的最小数字 6. 查找区间 正常实现 // text Input : [1,2,3,4,5] key : 3 return the index : 2 // java public int binarySearch(int[] nums, int key) {