LeetCode每日一刷(二)---两数之和

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

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

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

解题要点:
1.注意两数相加进位问题,carry
2.对于链表问题,返回结果为头结点时,通常需要先初始化一个预先指针 pre,该指针的下一个节点指向真正的头结点head。使用预先指针的目的在于链表初始化时无可用节点值,而且链表构造过程需要指针移动,进而会导致头指针丢失,无法返回结果。
解法一:递归法

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */

class Solution{
	public ListNode addTwoNum(ListNode l1,ListNode l2){
	int carry=0;
	if(l1==null&&l2==null&&carry==0){
		return null;
	}
	int sum = (l1==null?0:l1.val)+(l2==null?0:l2.val)+carry;
	//获取进位数
	carry = sum / 10;
	//获取链表值
	int val = sum % 10;
	ListNode l3 = new ListNode(val);
	//递归
	l3.next = addTwoNum((l1==null?0:l1.next)+(l2==null?0:l2.next)+carry);
	return l3;
	}
}

解法二:常规法

class Solution{
	public ListNode addTwoNum(ListNode l1,ListNode l2){
	int carry=0;
	//新建一个预先指针
	ListNode pre = new ListNode(0);
	ListNode cur = pre;
	while(l1!=null||l2!=null){
			int sum = (l1==null?0:l1.val)+(l2==null?0:l2.val)+carry;
				//获取进位数
	carry = sum / 10;
	//获取链表值
	int val = sum % 10;
	//new 一个对象cur内存块发生变化。
	//但是pre预留指针内存块未变化,内存值未改变。
	cur.next = new ListNode(val);
	//移动
	cur = cur.next;
	if(l1!=null){
	l1 = l1.next;
	}
	if(l2!=null){
	l2 = l2.next;
	}
	}
	if(carry == 1){
		cur.next = new ListNode(carry);
	}
	return pre.next;
	}
}

注:两个对象指向同一块内存,所以这块内存有任何变化,则两个对象一起联动变化。但是如果有其中任何一个对象指向另一块内存(比如new一个对象,赋值一个其他对象),那这两个对象则不再指向同一块内存,而是指向两块内存,内容不再联动变化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值