题目内容

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

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

java俩个字符串相加有null的情况 java中两个字符串相加_java俩个字符串相加有null的情况

示例 1:

输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.

示例 2:

输入:l1 = [0], l2 = [0]
输出:[0]

示例 3:

输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]

提示:

每个链表中的节点数在范围 [1, 100] 内
0 <= Node.val <= 9
题目数据保证列表表示的数字不含前导零

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

c语言解答(思路看了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;
    struct ListNode*q=l2;

    //先求出两个链表的长度
    //最少的长度为1,经过循环后,p已经到尾部了
    int len1=1;
    while(p->next!=NULL){
        p=p->next;
        len1++;
    }
       //最少的长度为1,经过循环后,q已经到尾部了
    int len2=1;
    while(q->next!=NULL){
        len2++;
        q=q->next;
    }
   //将两个链表的长度补成一样的,同时比较出len1和len2大小,长度最大值保存在max中
   int max=len1;
   if(len1<len2){
       max=len2;
       int len=len2-len1;
       while(len--){
       		//补齐链表,让两个链表长度等长
           struct ListNode*r=(struct ListNode*)malloc(sizeof(struct ListNode));
           r->val=0;
           r->next=NULL;
           //p指针在上面的时候已经变到尾部了
           p->next=r;
           p=p->next;
       }
   }
   if(len1>len2){
       int len=len1-len2;
       while(len--){
           struct ListNode*r=(struct ListNode*)malloc(sizeof(struct ListNode));
           r->val=0;
           r->next=NULL;
           //q指针在上面的时候已经变到尾部了
           q->next=r;
           q=q->next;
       }
   }
   //sign来表示是否进位
   int sum=0,sign=0;
   //把p q位置从新设置成头
   p=l1;
   q=l2;
   while(max--){
       sum=p->val+q->val+sign;
       sign=sum/10;
       p->val=sum%=10;
       if(p->next!=NULL){
            p=p->next;
            q=q->next;
       }
   }
   //上个while后,p q指针已经到尾部了,如果最后一位相加还有进位的话,那就再把链表加长1个就行了
   if(sign==1){
       struct ListNode*s=(struct ListNode*)malloc(sizeof(struct ListNode));
       s->val=1;
       s->next=NULL;
       p->next=s;
       return l1;
   }
   return l1;

}

改进了的c,参考了leetcode圈友java的题解,代码我把拿过来了大佬图解非常详细(我没看图,代码还是很好理解的)

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode pre = new ListNode(0);
        ListNode cur = pre;
        int carry = 0;
        while(l1 != null || l2 != null) {
            int x = l1 == null ? 0 : l1.val;
            int y = l2 == null ? 0 : l2.val;
            int sum = x + y + carry;
            
            carry = sum / 10;
            sum = sum % 10;
            cur.next = new ListNode(sum);

            cur = cur.next;
            if(l1 != null)
                l1 = l1.next;
            if(l2 != null)
                l2 = l2.next;
        }
        if(carry == 1) {
            cur.next = new ListNode(carry);
        }
        return pre.next;
    }
}

作者:guanpengchn
链接:https://leetcode-cn.com/problems/add-two-numbers/solution/hua-jie-suan-fa-2-liang-shu-xiang-jia-by-guanpengc/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

改进思路,其实就是自己建立个链表把结果都存起来,构造出一个符合答案的链表

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */



struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
	//p建立是用来保存建立链表的时候第一个节点位置,代码中第一个节点没有保存值,靠的是下一个节点存储值得
    struct ListNode*p=(struct ListNode*)malloc(sizeof(struct ListNode));
    // struct ListNode*p=l1;
    struct ListNode*q=p;
    //保存进位用的
    int sign=0;
    //没有遍历完最长的链表时候,一直遍历
    while(l1!=NULL||l2!=NULL){
        int x=0;
        int y=0;
        //l1 l2当前链表为空的话,取0,不空的话直接取结构中的值就行
        if(l1!=NULL){
            x=l1->val;
        }
        else{
            x=0;
        }
        if(l2!=NULL){
            y=l2->val;
        }
        else{
            y=0;
        }
        // int x=l1->val==NULL?0:l1->val;
        // int y=l2->val==NULL?0:l2->val;
        int sum=x+y+sign;
        sign=sum/10;
        sum%=10;
        //构建结构,添加到链表中
        struct ListNode*r=(struct ListNode*)malloc(sizeof(struct ListNode));
        q->next=r;
        r->val=sum;
        r->next=NULL;
        q=q->next;
        //后移当前l1 l2位置,在位置不是空的时候移动
        if(l1 != NULL)
            l1 = l1->next;
        if(l2 != NULL)
            l2 = l2->next;

    }
    //末尾相加有进位的时候,再创建个节点连接起来
    if(sign==1){
        struct ListNode*m=(struct ListNode*)malloc(sizeof(struct ListNode));
        m->next=NULL;
        m->val=1;
        q->next=m;
        return p->next;
    }
    return p->next;

}

思路

刚开始不是很喜欢看别人的思路和代码,现在感觉看看大佬写的,能进步非常快,学到好多思想,自己思考后没思路的话就要看别人的思路,然后学习,省的浪费时间.