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

C语言笔试题之两数相加(多次反转链表实现)

实例要求:

  • 1、给定两个非空链表(l1和l2)来代表两个非负整数
  • 2、数字最高位位于链表开始位置;
  • 3、它们的每个节点只存储一位数字
  • 4、将这两数相加会返回一个新的链表

案例展示:

在这里插入图片描述

实例分析:

  • 1、编写反转链表函数,反转链表l1和l2
  • 2、创建虚拟头节点;
  • 3、新建节点表示当前节点指针;
  • 4、计算进位和取个位数;
  • 5、连接新节点和更新当前节点指针;
  • 6、反转链表,得到最终结果;
  • 7、释放虚拟头节点的内存;

示例代码:

	/**
	 * Definition for singly-linked list.
	 * struct ListNode {
	 *     int val;
	 *     struct ListNode *next;
	 * };
	 */
	
	
	// 反转链表函数
	struct ListNode* reverseList(struct ListNode* head) {
		
		if(head == NULL || head->next == NULL){
		    return head;
		}
		
		struct ListNode *p = head;
		struct ListNode *q = p->next;
		 
		p->next = NULL;
		 
		while(q){
		 
		    p = q->next;
		    q->next = head;
		    head = q;
		    q = p;
		 
		}
		
		return head;
		
	}
	
	// 将两个链表表示的非负整数相加
	struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) 
	{
	    l1 = reverseList(l1); // 反转链表l1
	    l2 = reverseList(l2); // 反转链表l2
	
	    struct ListNode *dummy = (struct ListNode*)malloc(sizeof(struct ListNode)); // 创建虚拟头节点
	    dummy->val = 0;
	    dummy->next = NULL;
	    struct ListNode *curr = dummy; // 当前节点指针
	    int carry = 0; // 进位
	
	    while (l1 || l2 || carry) 
	    {
	        int sum = carry;
	        if (l1 != NULL) {
	            sum += l1->val;
	            l1 = l1->next;
	        }
	        if (l2 != NULL) {
	            sum += l2->val;
	            l2 = l2->next;
	        }
	        carry = sum / 10; // 计算进位
	        struct ListNode *newNode = (struct ListNode*)malloc(sizeof(struct ListNode)); // 创建新节点
	        newNode->val = sum % 10; // 取个位数
	        newNode->next = NULL;
	        curr->next = newNode; // 连接新节点
	        curr = curr->next; // 更新当前节点指针
	    }
	
	    struct ListNode *result = reverseList(dummy->next); // 反转链表,得到最终结果
	    free(dummy); // 释放虚拟头节点的内存
	    return result;
	}

运行结果:

在这里插入图片描述
在这里插入图片描述


http://www.kler.cn/a/233301.html

相关文章:

  • 硬件工程师之电子元器件—二极管(4)之热量对二极管温度特性的影响
  • Vector 深度复制记录
  • 陪诊问诊APP开发实战:基于互联网医院系统源码的搭建详解
  • vue2.7.14 + vant + vue cli脚手架转vite启动运行问题记录
  • C#发票识别、发票查验接口集成、电子发票(航空运输电子行程单)
  • uni-app移动端与PC端兼容预览PDF文件
  • Git中为常用指令配置别名
  • Go 中如何检查文件是否存在?可能产生竞态条件?
  • re:从0开始的CSS学习之路 4. 长度单位
  • 2月05日,每日信息差
  • SolidWorks学习笔记——入门知识2
  • 用C语言列出Linux或Unix上的网络适配器
  • 【C语言】深入理解指针
  • 从一到无穷大 #23 《流计算系统图解》书评
  • Netty应用(一) 之 NIO概念 基本编程
  • 人工智能|深度学习——基于全局注意力的改进YOLOv7-AC的水下场景目标检测系统
  • C++——位图与布隆过滤器
  • JVM系列——垃圾收集器Parrlel Scavenge、CMS、G1常用参数和使用场景
  • 二维差分---三维差分算法笔记
  • Android:自定义控件
  • Vue 封装的 axios 类的使用(小bug 改进)
  • 5G技术对物联网的影响
  • C# BackgroundWorker的使用
  • 广义表-C语言
  • 面向工业 X.0 的工业网络简述
  • 微软.NET6开发的C#特性——类、结构体和联合体