leetcode第二题及 pointer points here memory cannot be printed

这篇博客详细介绍了LeetCode第二题的解决方案,即如何求两个链表的和。首先计算两个链表的长度,然后在较长的链表上进行加法操作。接着逐位相加,考虑进位,并处理链表不等长的情况。最后,当链表相加后长度超过最长链表时,要确保新开辟的节点内存对齐,防止运行时错误。
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
    struct ListNode *p = l1,*q = l2,*r;
    struct ListNode *p1 = l1,*q1 = l2;
    struct ListNode* l = (struct ListNode*)malloc(sizeof(struct ListNode));
    l->next = 0;
    int length1 = 0,length2 = 0,add = 0;
    while(p1 != 0){
        length1++;
        p1 = p1->next;
    }
     while(q1 != 0){
        length2++;
        q1 = q1->next;
    }
    if(length1 >=length2){
        while(q != 0){
            add += p->val + q->val;
            if(add >= 10){
                p->val =add-10;
                add = 1;
            }
            else{
                p->val =add;
                add = 0;
            }
            r = p;
            p = p->next;
            q = q->next;
        }
        while(p !=0){
            add +=p->val;
            if(add >= 10){
                p->val =add-10;
                add = 1;
            }
            else{
                p->val =add;
                add = 0;
            }
            r = p;
            p = p->next;
        }
        if(add){
            l->val = 1;
            r->next = l;
            l->next == 0;
        }
        return l1;
    }
    else{
        while(p != 0){
            add += q->val + p->val;
            if(add >= 10){
                q->val =add-10;
                add = 1;
            }
            else{
                q->val =add;
                add = 0;
            }
            r = q;
            q = q->next;
            p = p->next;
        }
        while(q !=0){
            add +=q->val;
            if(add >= 10){
                q->val =add-10;
                add = 1;
            }
            else{
                q->val =add;
                add = 0;
            }
            r = q;
            q = q->next;
        }
        if(add){
            l->val = 1;
            r->next = l;
            l->next == 0;
        }
        return l2;
    }
}

一、第二题先求两个链表的长度length1和length2,在长的链表中做加法

二、长链表与短链表第一个数相加,如果相加之和小于10,则把值赋给长的链表;若大于等于10则把个位数赋给长链表,并记进位符add为1.

三、长短链表第二个数相加并加上进位符,以此类推。若短链表所有值加完,长链表中还有数,长链表中值加add(例:8->5->1->1 + 2->4 = 0-> 0->2->1,短链表完成,进位符为1,第三位为2,此时进位符为0,第四位不变为1)

四、若两链表相加后,长度大于长的链表,则再开辟一个节点“l”储存进位符(例9->9->9 + 1 = 0-> 0->0->1)。注意:新开辟的“l”中next指针未指向任何空间,可能出现runtime error: member access within misaligned address 0xbebebebebebebebe for type ‘struct ListNode’, which requires 8 byte alignment (ListNode.c) 0xbebebebebebebebe: note: pointer points here 错误,应该添加l->next = NULL;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值