力扣---两数相加

本文介绍了一个使用链表表示非负整数并实现两数相加的算法。链表的位数逆序存储,每个节点保存一位数字。通过遍历两个链表,逐位相加并处理进位,生成新的链表表示和。文章提供了详细的C语言实现代码,包括链表的创建、遍历、相加和释放等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

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

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

 

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
#include <stdio.h>
#include <stdlib.h>

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


void* insert_tail(struct ListNode* head,int val)
{
	if(!head){
		return NULL;
	}
	struct ListNode *tmp_new_node = NULL,*tmp_p = head,*tmp_q = NULL;
	tmp_new_node = (struct ListNode *)malloc(sizeof(struct ListNode) );
	if(!tmp_new_node){
		return NULL;
	}
	tmp_new_node->val = val;
	tmp_new_node->next = NULL; 
	while(tmp_p->next){
		tmp_p = tmp_p->next; 
	}
	tmp_p->next = tmp_new_node;
}
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
   	struct ListNode *p = l1->next,*q = l2->next,*new_head = NULL;
   	
   	int add = 0,add_one = 0;
	new_head = (struct ListNode *)malloc(sizeof(struct ListNode) );
	if(!new_head){
		return NULL;
	}
	new_head->next = NULL; 

   	while(p && q){
        add =  p->val + q->val + add_one;
        if(add >= 10){
           add -= 10;
           add_one = 1;
        }else{
            add_one = 0;
        }
         p = p->next;
		 q = q->next;
		 
		insert_tail(new_head,add);
   }
 
   	if(!p && q){
   		while(q){
   			
   			add = q->val + add_one;
   			if(add >= 10){
   				add -= 10;
   				add_one = 1;
			}else{
				add_one = 0;
			}
   			q = q->next;
			insert_tail(new_head,add);		
		}
       
   	}else if(p && !q){
   		
		while(p){	
   			add = p->val + add_one;
   			if(add >= 10){
   				add -= 10;
   				add_one = 1;
			}else{
				add_one = 0;
			}
   			p = p->next;
			insert_tail(new_head,add);		
		}
        
   		
	}
   	if(add_one == 1){
        insert_tail(new_head,1);
	}

 	return new_head;  
}

struct ListNode * init_head(struct ListNode *head)
{
	head = (struct ListNode *)malloc(sizeof(struct ListNode) );
	if(!head){
		return NULL;
	}
	else{
		head->next = NULL;
	}
	return head;
}

void insert_node(struct ListNode *head,int val)
{
	if(!head){
		return ;
	}
	
	struct ListNode *p = head,*new_node = NULL;
	new_node = (struct ListNode *)malloc(sizeof(struct ListNode) );
	if(!new_node){
		return ;
	}
	new_node->val = val;
	new_node->next = p->next;
	p->next = new_node;
}

void print_list(struct ListNode *head)
{
	if(!head){
		return ;
	}
	struct ListNode *p = head->next;
	while(p){
		printf("%d\n",p->val);
		p = p->next;
	}
	printf("--------------------------------\n");
}

void free_list(struct ListNode *head)
{
	if(!head){
		return ;
	}
	
	struct ListNode *p = head->next,*q = NULL;
	while(p){
		q = p->next;
		free(p);
		p = q;
	}
	free(head);
}
int main()
{
	struct ListNode *l1 = NULL,*l2 = NULL;
	l1 = init_head(l1);
	insert_node(l1,3);
	insert_node(l1,4);
	insert_node(l1,2);
	print_list(l1);
	
	

	l2 = init_head(l2);
	insert_node(l2,4);
	insert_node(l2,6);
	insert_node(l2,5);
	print_list(l2);
	
	
	struct ListNode* ret = addTwoNumbers(l1,l2);
	print_list(ret);
	
	free_list(l1);
	free_list(l2);
	free_list(ret);
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值