Leetcode两数相加链表——C

博客源自LeetCode题目,给出两个逆序存储数字的非空链表,求两数之和并以新链表表示。题解用C语言实现,考虑链表对应位置相加及进位情况,如两链表都不为空、一个为空等情况,将每次得到的数值插入新链表。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers

题目

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

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

题解——C

其实这个也不难,实现可能有点困难
其实就是链表对应位置数值相加,条件:
1、当 l1 和 l2 都不为空时,链表对应位置相加,判断是否需要进位。
2、当 l1 不为空、 l2 为空,判断 l1 与进位值相加是否需要进位。
3、当 l1 为空、 l2 不为空,判断 l2 与进位值相加是否需要进位.
4、当 l1 和 l2 都为空时,判断进位是否有值,有则增加一位。
把得到的每次数值都插入新的链表。

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
	struct ListNode *head;					//头结点 
    struct ListNode *p;						//插入结点 
    head=(struct ListNode *)malloc(sizeof(struct ListNode));
    head->next=NULL;						//初始化 
    p=head;
    
	int addNum = 0;							//记录上一个节点的和是否有进位  
	int sum = 0;							//每个节点当前位的和 
	while (l1!=NULL || l2!=NULL || addNum==1) {
		//新建一个结点 
		struct ListNode *node = (struct ListNode *)malloc(sizeof(struct ListNode));
		node->val = 0; 
		node->next = NULL;
		
		if (l1!=NULL&&l2!=NULL) { 
	      	sum = l1->val + l2->val; 
			sum += addNum; 
			int val = sum%10; 				//超过十,求10的余数即个位 
			node->val = val; 
			l1 = l1->next; 
			l2 = l2->next; 
		}
		else if (l1!=NULL&&l2==NULL) { 
			sum = l1->val; 
			sum += addNum; 
			int val = sum%10;				//超过十,求10的余数即个位  
			node->val = val; 
			l1 = l1->next; 
		}
		else if (l1==NULL&&l2!=NULL) { 
			sum = l2->val; 
			sum += addNum; 
			int val = sum%10; 				//超过十,求10的余数即个位 
			node->val = val; 
			l2 = l2->next; 
		}
		else {
	      	node->val = addNum;				//两个链表都遍历结束但尾节点相加还有进位  
			addNum = 0; 
			sum = 0; 
		} 
		addNum = sum>=10 ? 1 : 0; 			//判断是否进位 
		
		printf("%d\n",node->val);			//尾插法
	    p->next=node;
		p=node;
	}
	return head->next;						//返回头结点 
}

结果

根据自己猜测编写的函数

#include<stdio.h>
#include<malloc.h>

struct ListNode {
	int val;
	struct ListNode *next;
};

//创建链表 
struct ListNode *createNode(int Array[],int size)
{
    struct ListNode *head;
    struct ListNode *p;
    head=(struct ListNode *)malloc(sizeof(struct ListNode));
    head->next=NULL;
    p=head;

    for(int i=0;i<size;i++)
    {
        struct ListNode *node=(struct ListNode *)malloc(sizeof(struct ListNode));	
        node->val=Array[i];										
        node->next=NULL;

        p->next=node;								//尾插法 
        p=node;
    }
    printf("创建成功!\n");
    return head->next;								//返回头结点
}

int main(){
	int array1[]={2,4,3,2};
	int array2[]={5,6,4};
	int size1=sizeof(array1)/sizeof(int);
	int size2=sizeof(array2)/sizeof(int);
	struct ListNode* l1=createNode(array1,size1);	//遍历查看结果,但使用时不能遍历,不然指针结点会移到最后,导致空 
//	while(l1!=NULL){
//        printf("%d\n",l1->val);
//        l1=l1->next;
//    }
    
	struct ListNode* l2=createNode(array2,size2);
//	while(l2!=NULL){
//        printf("%d\n",l2->val);
//        l2=l2->next;
//    }
	
	struct ListNode* L=addTwoNumbers(l1,l2);
	while(L!=NULL){
        printf("%d",L->val);
        L=L->next;
    }
    
	return 0; 
}

结果展示
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值