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

力扣Leetcode:2. 两数相加(C++、Python、Java)

题目描述

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

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

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

题解

这道题目比较简单,从前到后遍历两个链表,对应位置上的数字相加,同时注意进位即可。具体地:

  • 当前位置相加后的结果需要取余10。
  • 当前位置不仅要加两个数,还要加上前一步的进位值。
  • 若当前位置相加后大于10,要向后进位。
  • 可能最后计算出的结果会多出来一位。

这里的一个技巧是,在具体实现时,可以借助递归。

代码

Python

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next

class Solution(object):
    def dfs(self,l1,l2,flag):
        if l1 is None and l2 is None:
            return None if flag==0 else ListNode(1)
        if l2 is None:
            return ListNode((l1.val+flag)%10,self.dfs(l1.next,None,(l1.val+flag)//10))
        if l1 is None:
            return ListNode((l2.val+flag)%10,self.dfs(None,l2.next,(l2.val+flag)//10))
        return ListNode((l1.val+l2.val+flag)%10,self.dfs(l1.next,l2.next,(l1.val+l2.val+flag)//10))
        
    def addTwoNumbers(self, l1, l2):
        return self.dfs(l1,l2,0)

这里使用了递归,借助了ListNode的初始化方法,传入当前的值与之后的指针。dfs方法每次返回一个指针。

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 curr1=l1,curr2=l2;
    	boolean flag=false;
    	ListNode list=new ListNode((curr1.val+curr2.val)%10);
    	ListNode curr3=list;
    	if(curr1.val+curr2.val>=10) 
    		flag=true;
    	while(curr1.next!=null&&curr2.next!=null) {
    		curr1=curr1.next;
    		curr2=curr2.next;
    		if(flag==true) {
    			curr3.next=new ListNode((curr1.val+curr2.val+1)%10);
    			if(curr1.val+curr2.val+1>=10)
    				flag=true;
    			else
    				flag=false;
    		} else {
    			curr3.next=new ListNode((curr1.val+curr2.val)%10);
    			if(curr1.val+curr2.val>=10)
    				flag=true;
    			else
    				flag=false;
    		}
    		curr3=curr3.next;
    	}
    	while(curr1.next!=null) {
    		curr1=curr1.next;
    		if(flag==true) {
    			curr3.next=new ListNode((curr1.val+1)%10);
    			if(curr1.val+1>=10)
    				flag=true;
    			else
    				flag=false;
    		} else {
    			curr3.next=new ListNode((curr1.val)%10);
    			flag=false;
    		}
    		curr3=curr3.next;
    	}
    	while(curr2.next!=null) {
    		curr2=curr2.next;
    		if(flag==true) {
    			curr3.next=new ListNode((curr2.val+1)%10);
    			if(curr2.val+1>=10)
    				flag=true;
    			else
    				flag=false;
    		} else {
    			curr3.next=new ListNode((curr2.val)%10);
    			flag=false;
    		}
    		curr3=curr3.next;
    	}
        if(flag==true) {
            curr3.next=new ListNode(1);
            curr3=curr3.next;
        }
    	curr3.next=null;
    	return list;
    }
}

Java代码是两年前写的了,没有使用递归,直接一步步计算、多层判断的,可能有些冗长,有较多的待优化的地方。因为以后基本不用Java了,所以在这里就不改进了,仅供参考算法流程。

C++

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
	public:
		ListNode* dfs(ListNode* l1, ListNode* l2, int flag) {
			if(l1==nullptr and l2==nullptr) {
				if(flag) return new ListNode(flag);
				return nullptr;
			} else if(l1==nullptr) {
				return new ListNode((l2->val+flag)%10, dfs(l1, l2->next, (l2->val+flag)/10));
			} else if(l2==nullptr) {
				return new ListNode((l1->val+flag)%10, dfs(l1->next, l2, (l1->val+flag)/10));
			} else {
				return new ListNode((l1->val+l2->val+flag)%10, dfs(l1->next, l2->next, (l1->val+l2->val+flag)/10));
			}
		}

		ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
	 		return dfs(l1, l2, 0);
		}
};

相关文章:

  • 解决jsp程序不直接、代码与UI混杂的痛: JSPWidget
  • Python TypeError: unsupported operand type(s) for /: ‘list‘ and ‘int‘
  • Hello,.NET Compact Framework 2.0(二)
  • 力扣Leetcode:4. 寻找两个正序数组的中位数(Python)
  • Smart Client Case Study Source Code Download from MSDN China
  • 力扣Leetcode:5. 最长回文子串(Python)
  • 古诗词推荐(一):春风十里扬州路,卷上珠帘总不如
  • 终于签完了
  • 古诗词推荐(二):若似月轮终皎洁,不辞冰雪为卿热
  • 腾讯面经zz
  • 力扣Leetcode:10. 正则表达式匹配(Python)
  • 从《关于跳槽的切身体会(转)》谈转载文章的职业道德!!!
  • 力扣Leetcode:11. 盛最多水的容器(Python、Java)
  • 劝学诗整理:安居不用架高堂,书中自有黄金屋。
  • 服务器群集:Windows Server 2003 备份和恢复的最佳做法
  • 2017年终总结、随想
  • 30天自制操作系统-2
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • es6要点
  • ES6语法详解(一)
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • java概述
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • js学习笔记
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • SQL 难点解决:记录的引用
  • 大数据与云计算学习:数据分析(二)
  • 多线程事务回滚
  • 翻译--Thinking in React
  • 反思总结然后整装待发
  • 和 || 运算
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 云大使推广中的常见热门问题
  • 第二十章:异步和文件I/O.(二十三)
  • # C++之functional库用法整理
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • $(selector).each()和$.each()的区别
  • (6)STL算法之转换
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (排序详解之 堆排序)
  • (顺序)容器的好伴侣 --- 容器适配器
  • (转)http协议
  • (转)Linux下编译安装log4cxx
  • (转)setTimeout 和 setInterval 的区别
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • *2 echo、printf、mkdir命令的应用
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .NET命名规范和开发约定
  • @Autowired自动装配
  • @JSONField或@JsonProperty注解使用