当前位置: 首页 > news >正文

LeetCode | 两数相加 C语言

Problem: 2. 两数相加

文章目录

  • 思路
  • 解题方法
  • Code
  • 一些感想

思路

主要是一一相加和逆序的方式存储
先说逆序储存,看下图
我们先声明出指针p和指针q,还有指针head(主要用于return上而已),然后进行一系列操作,之后,p = q,之后的操作就是对q进行,至于p,只做一个动作,p = q
逆序储存的思想

	int flag = 0;struct ListNode *p = NULL, *q = NULL, *head = NULL;while(l1 != NULL && l2 != NULL) {if(flag == 0) {flag = 1;p = (struct ListNode*)malloc(sizeof(struct ListNode));p->next = NULL;head = p;} else {q = (struct ListNode*)malloc(sizeof(struct ListNode));q->next = NULL;p->next = q;p = q;}l1 = l1->next;l2 = l2->next;}

至于相加嘛!好说,将对应的两个数加起来,然后检查是否大于9,如果是,则要保留个位,并进一位(也就是将十位数的部分放入下一个相加的过程中),以指针p的部分为例——指针q的部分也一样。

p->val = l1->val + l2->val;
if(p->val > 9) {last = p->val / 10;p->val %= 10;
} else last = 0;

但是,要知道,l1与l2终会到达null,所以,对于剩余的部分也只是解决前面的“进一位”遗留的问题而已.

    while(l1 != NULL) {q = (struct ListNode*)malloc(sizeof(struct ListNode));q->val = l1->val + last;if(q->val > 9) {last = q->val / 10;q->val %= 10;} else last = 0;q->next =NULL;p->next = q;p = q;l1 = l1->next;}
    while(l2 != NULL) {q = (struct ListNode*)malloc(sizeof(struct ListNode));q->val = l2->val + last;if(q->val > 9) {last = q->val / 10;q->val %= 10;} else last = 0;q->next =NULL;p->next = q;p = q;l2 = l2->next;}

到最后,倘若还存在进一位,就得要再建一个节点。

    if(last > 0) {q = (struct ListNode*)malloc(sizeof(struct ListNode));q->val = last;if(q->val > 9) {last = q->val / 10;q->val %= 10;} else last = 0;q->next =NULL;p->next = q;p = q;}

解题方法

由思路可知

Code

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {struct ListNode *p = NULL, *q = NULL, *head = NULL;int flag = 0, last;while(l1 != NULL && l2 != NULL) {if(flag == 0) {flag = 1;p = (struct ListNode*)malloc(sizeof(struct ListNode));p->val = l1->val + l2->val;if(p->val > 9) {last = p->val / 10;p->val %= 10;} else last = 0;p->next = NULL;head = p;} else {q = (struct ListNode*)malloc(sizeof(struct ListNode));q->val = l1->val + l2->val + last;if(q->val > 9) {last = q->val / 10;q->val %= 10;} else last = 0;q->next =NULL;p->next = q;p = q;}l1 = l1->next;l2 = l2->next;}while(l1 != NULL) {q = (struct ListNode*)malloc(sizeof(struct ListNode));q->val = l1->val + last;if(q->val > 9) {last = q->val / 10;q->val %= 10;} else last = 0;q->next =NULL;p->next = q;p = q;l1 = l1->next;}while(l2 != NULL) {q = (struct ListNode*)malloc(sizeof(struct ListNode));q->val = l2->val + last;if(q->val > 9) {last = q->val / 10;q->val %= 10;} else last = 0;q->next =NULL;p->next = q;p = q;l2 = l2->next;}if(last > 0) {q = (struct ListNode*)malloc(sizeof(struct ListNode));q->val = last;if(q->val > 9) {last = q->val / 10;q->val %= 10;} else last = 0;q->next =NULL;p->next = q;p = q;}return head;
}

一些感想

其实,当时在解决这道题的时候,碰到过这样的问题

Line 70: Char 15: runtime error: member access within misaligned address 0xbebebebebebebebe for type 'struct ListNode', which requires 8 byte alignment [ListNode.c]0xbebebebebebebebe: note: pointer points here<memory cannot be printed>

后来,在我看了AuthurLEE的文章之后,我才知道原来是忘记在初始化的时候,让指针指向NULL了(包括head指针,还有结构体里面的next)

http://www.lryc.cn/news/305806.html

相关文章:

  • 【Spring MVC】处理器映射器:AbstractHandlerMethodMapping源码分析
  • 网络编程知识整理
  • 【小白友好】leetcode 移动零
  • 迭代、递归、尾递归实现斐波那契数列的第n项
  • vulnhub靶场之driftingblues-1
  • NGINX服务器配置实现加密的WebSocket连接WSS协议
  • 5个免费文章神器,用来改写文章太方便了
  • 详细教程!VMware Workstation Pro16 安装 + 创建 win7 虚拟机!
  • Python文件和异常(二)
  • 大模型+影像:智能手机“上春山”
  • 8-pytorch-损失函数与反向传播
  • MySQL高级特性篇(8)-数据库连接池的配置与优化
  • mac下使用jadx反编译工具
  • 分布式一致性软件-zookeeper
  • 企业计算机服务器中了babyk勒索病毒怎么办?Babyk勒索病毒解密数据恢复
  • 板块一 Servlet编程:第五节 Cookie对象全解 来自【汤米尼克的JAVAEE全套教程专栏】
  • 自动驾驶---Motion Planning之Path Boundary
  • Leetcode 3048. Earliest Second to Mark Indices I
  • 从源码学习单例模式
  • axios介绍和使用
  • redis雪崩问题
  • [SUCTF 2019]EasySQL1 题目分析与详解
  • TestNG与ExtentReport单元测试导出报告文档
  • 【JavaEE】_form表单构造HTTP请求
  • Mysql中INFORMATION_SCHEMA虚拟库使用
  • 【《高性能 MySQL》摘录】第 2 章 MySQL 基准测试
  • 常用的Web应用程序的自动测试工具有哪些
  • 人工智能与开源机器学习框架
  • 高通XBL阶段读取分区
  • [极客大挑战2019]upload