20200114:(leetcode)两数相加

题目

在这里插入图片描述
注意点:不以0开头

主要思路

  1. 逐个相加即可,注意需要逆序加,注意进位即可;
  2. 由于数字是个位数的,因此进位只有可能是0或者1
  3. 注意定义的有参构造器。

代码实现

自写了半天一看官方题解,差距太大,直接附上官方题解以及个人理解的注释

package com.immunize.leetcode.addTwoNumbers;

/**
 * 两数相加
 * 
 * @author Mr IMMUNIZE
 *
 */
public class Solution {

	public class ListNode {
		int val;
		ListNode next;
		// 注意不要忽略这个含参构造器
		ListNode(int x) {
			val = x;
		}
	}

	public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
		// 新定义哑节点dummyHead,且该节点值为0
		ListNode dummyHead = new ListNode(0);
		// 定义指针p,q,curr,curr指向当前哑节点
		ListNode p = l1, q = l2, curr = dummyHead;
		// 进位值默认为0
		int carry = 0;
		// 当两个list的值至少有一个不为0时即刻进行计算
		while (p != null || q != null) {
			// 获取两个指针指向的节点的值
			int x = (p != null) ? p.val : 0;
			int y = (q != null) ? q.val : 0;
			// 值相加再加上默认的进位值0
			int sum = carry + x + y;
			// 更新进位值
			carry = sum / 10;
			// 新建一个sum值的个位的节点,并且作为哑节点的下一节点
			curr.next = new ListNode(sum % 10);
			// 节点后移
			curr = curr.next;
			// 最后判断两个list是否已经遍历完成
			if (p != null)
				p = p.next;
			if (q != null)
				q = q.next;
		}
		// 若进位值不为0,也可写作carry == 1 或 carry != 0,此时直接将下一节点赋值为1即可
		if (carry > 0) {
			curr.next = new ListNode(carry);
		}
		// 返回哑结点的所有后续节点即为新的序列
		return dummyHead.next;
	}

}

发布了88 篇原创文章 · 获赞 11 · 访问量 3389
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 像素格子 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览