Leetcode 2.两数相加

题目

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

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

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

示例:

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

解答

方法一:自己拼凑的写法:

自己总结需要解决四个问题:

  1. 初始判断是否为空问题
  2. 返回的链表的迭代问题
  3. 当前值大于10下一个值加一,并且记录当前值的问题
  4. 如何循环,怎样跳出循环的问题

总结来说,写法十分啰嗦,但清晰明了

import java.util.List;

public class Test2 {
	
	public static void bLPrint(ListNode l){
		while(l != null){
			System.out.println(l.val);
			l = l.next;
		}
	}
	
	public static void main(String[] args) {
		//先创建l1:
		//l1:2->lt:4-> :3
		ListNode l1 = new ListNode(2);
		l1.next = new ListNode(6);
		ListNode lt = l1.next;
		lt.next = new ListNode(3);
		//创建l2:
		//l1:5->lt:6-> :4
		ListNode l2 = new ListNode(5);
		l2.next = new ListNode(6);
		lt = l2.next;
		lt.next = new ListNode(4);
		
		ListNode l3 = addTwoNumbers(l1, l2);
		bLPrint(l3);
	}
	
	
	public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
    	
		//初始判断是否为空问题
		//判断传递参数是否为空:
		if(l1 == null&&l2 == null){
			return null;
		}
		if(l1 == null){//如果l1为空则创建新的为0的节点
			l1 = new ListNode(0);
		}
		if(l2 == null){//如果l2为空则创建新的为0的节点
			l2 = new ListNode(0);
		}
		
		//新建链表的迭代问题
		//返回类型是链表,因此新建链表
		ListNode l3 = new ListNode(0);
		//循环遍历链表:创建l3
		ListNode lt;//lt作为下一个节点
		lt = l3;
		boolean isTen = false;
		while(true){//若l1或l2的指向不为空,则遍历
			lt.val += l1.val+l2.val;//将这两个的值赋给lt
			
			//当前值为10下一个值加一问题
			if(lt.val >= 10){//若lt.val为10,则标记下一个为1,当前值为0
				lt.val -= 10;
				lt.next = new ListNode(1);
				isTen = true;
			}
			
			
			//循环和指向下个节点问题
			if(l1.next != null||l2.next != null||isTen){//若三者有一个不为空则还可以往下走,即可循环条件满足
				
				if(l1.next == null){//如果l1的下一个为空则创建新的为0的节点
					l1.next = new ListNode(0);
				}
				if(l2.next == null){//如果l1的下一个为空则创建新的为0的节点
					l2.next = new ListNode(0);
				}
				if(!isTen){
					lt.next = new ListNode(0);
				}else {
					isTen = false;
				}
				//将所有节点指向下一个
				lt = lt.next;
				l1 = l1.next;
				l2 = l2.next;
				
			}else{//只有两个同时为空才会跳出循环,可循环条件不满足
				return l3;
			}
		}
		
    }
}

class ListNode {
	int val;
	ListNode next;
	ListNode(int x) { val = x; }
}

方法二:借鉴评论中解法:

与上个解法不同的是,用空间换时间。
判断l1和l2中节点数目是否相等,若不相等则将数目少的一方新增节点直到相等,最后统计节点数量,为返回值链表创建做基础。
创建返回值链表即与上方法相同,判断是否本节点值大于10,并且做出相应的处理。

public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
		
		if(l1 == null&&l2 != null){//若l1为空,则l1创建新节点,新节点为0
			l1 = new ListNode(0);
		}else if(l1 != null&&l2 == null){
			l2 = new ListNode(0);
		}else if(l1 == null&&l2 == null){
			return null;
		}
		
		ListNode ll1 = l1;
		ListNode ll2 = l2;
		int size = 0;
		while(l1 != null||l2 != null){//创造两节点数量相等,并且计算每个链表有几个节点
			if(l1.next == null&&l2.next != null){//若l1为空,则l1创建新节点,新节点为0
				l1.next = new ListNode(0);
			}else if(l1.next != null&&l2.next == null){
				l2.next = new ListNode(0);
			}
			l1 = l1.next;
			l2 = l2.next;
			size++;
		}
		
		//新建链表,为返回值
		ListNode l3 = new ListNode(0);
		ListNode ln;//ln为被迭代对象
		ln = l3;
		
		for(int i = 0;i<size;i++){
			ln.val += ll1.val + ll2.val;//两数相加赋值
			if(ln.val>=10){
				ln.val-=10;
				ln.next = new ListNode(1);
			}else{
				if(ll1.next != null){//说明还有后续,则新建下一节点
					ln.next = new ListNode(0);
				}else{
					break;
				}
			}
			//将所有节点指向下一个
			ln = ln.next;
			ll1 = ll1.next;
			ll2 = ll2.next;
		}
		return l3;
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,Leetcode 2 "两数相加"是一个涉及链表的问题。该问题给定了两个非负整数,每个整数的每一位都是按照逆序的方式存储在链表中。我们需要将这两个链表相加,并返回一个新的链表作为结果。 具体解题思路可以使用迭代法或递归法来解决。迭代法的伪代码如下所示: ``` 初始化一个哑节点 dummy 和一个进位 carry,同时把两个链表的头节点分别赋值给 p 和 q 遍历链表,直到 p 和 q 都为 None 计算当前的和 sum 为 p.val + q.val + carry 计算当前的进位 carry 为 sum // 10 创建一个新节点 node,节点的值为 sum % 10 把新节点连接到结果链表的尾部 更新 p 和 q 分别为 p.next 和 q.next 如果最后还有进位 carry,则创建一个新节点 node,节点的值为 carry,并连接到结果链表的尾部 返回结果链表的头节点 dummy.next ``` 递归法的伪代码如下所示: ``` 定义一个辅助函数 addTwoNumbersHelper,输入为两个链表的头节点 p 和 q,以及进位 carry 如果 p 和 q 都为 None 且 进位 carry 为 0,则返回 None 计算当前的和 sum 为 p.val + q.val + carry 计算当前的进位 carry 为 sum // 10 创建一个新节点 node,节点的值为 sum % 10 设置新节点的下一个节点为递归调用 addTwoNumbersHelper(p.next, q.next, carry) 返回新节点 返回 addTwoNumbersHelper(p, q, 0) 的结果 以上是解决 Leetcode 2 "两数相加"问题的两种方法。如果你还有其他相关问题,请
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值