两数之和

from leetcode-cn.com:
给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。

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

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807


解答:(C语言)

/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {

    int flag=0;

    int sum=0;

    struct ListNode * p;
    struct ListNode * p1;
    struct ListNode * p2;



    p=(struct ListNode* ) malloc (sizeof(struct ListNode));

    p2=p;

    while(l1!=NULL || l2!=NULL){

        /*
        处理链表长度不一致的情况
        */
        int x = (l1!=NULL)?l1->val : 0;

        int y = (l2!=NULL)?l2->val : 0;


        sum = x + y + flag;

        p1=(struct ListNode* ) malloc (sizeof(struct ListNode));

        p1->val = sum%10;

        p1->next = NULL;


        flag = (sum>=10)?1:0;

        p->next = p1;

        p = p->next;

        if(l2!=NULL){
            l2=l2->next;
        }
    
        if(l1!=NULL){
            l1=l1->next;
         }    

    }

    /*
    *处理最后进位情况

            l1=[9,9]
            l2=[1]
        求和运算最后可能出现额外的进位,这一点很容易被遗忘
    */
    if(flag>0){
        p1 = (struct ListNode* ) malloc (sizeof(struct ListNode));
        p1->val = flag;
        p1->next = NULL;
        p->next = p1;

    }


    return p2->next;

}                                


遇到的问题:

  • member access within misaligned address 0x000000000031 for type 'struct ListNode', which requires 8 byte alignment
  • 这个问题是在 p1=(struct ListNode* ) malloc (sizeof(struct ListNode)); 开辟空间后,未对p1->next赋值。
  • member access within null pointer of type 'struct ListNode'
  • 这个问题在于未对结构体是否为空进行检查,导致使用结构体属性值的时候报错。
原文地址:https://www.cnblogs.com/zhuandshao/p/9376311.html