LeetCode||两数相加--给定两个 非空 链表来表示两个非负整数。位数按照 逆序 方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。

题目描述:

给定两个 非空 链表来表示两个非负整数。位数按照 逆序 方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。

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

示例:

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

算法描述

从左往右依次遍历两个输入的List,对这两个List的Node对应加和,但是要注意的就是进位问题和这里的数字是反向的,注意进位判断,其实这个反向的条件对我们是有利的,因为这和我们平常加法算数是一致的,从低位到高位,这里只不过改成从左往右了,原理都是一样的。

还要注意输入链表的最后一个结点位置,我们用循环来遍历的时候就需要每一次都检查链表是不是最后一个结点,而且两个链表长度未必一样,注意空引用判断。

代码实现:

创建链表(节点类):

class ListNode {
	public int val;
	public ListNode next;

	public ListNode(int i) {
		this.val = i;
	}

	public int val() {
		return val;
	}
}

实现的主要逻辑:

public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
		ListNode l4 = new ListNode(0);
		ListNode l3 = new ListNode(0);
		l4.next = l3;

		while (l1 != null || l2 != null) {
			int val1 = l1 == null ? 0 : l1.val;
			int val2 = l2 == null ? 0 : l2.val;
			// 创建新的结点
			ListNode l5 = new ListNode(0);
			// 进位
			l5.val = (val1 + val2 + l3.val) / 10;
			// 当前位
			l3.val = (val1 + val2 + l3.val) % 10;

			// 如果是最后一次循环,且最后一位为0,那么就要除去这个结点
			if (l5.val == 0 && (l1 != null ? l1.next : null) == null && (l2 != null ? l2.next : null) == null) {
				l3.next = null;
			} else {
				l3.next = l5;
				l3 = l5;
			}

			// 跳转指针
			l1 = l1 == null ? null : l1.next;
			l2 = l2 == null ? null : l2.next;
		}
		return l4.next;
	}

 

测试代码:

输出逻辑:

public static void printList(ListNode l) {
		while (l != null) {
			System.out.print(l.val);
			System.out.print("->");
			l = l.next;
		}
	}

输入输出:

public static void main(String[] args) {
		ListNode l1 = new ListNode(2);
		ListNode l2 = new ListNode(4);
		ListNode l3 = new ListNode(3);
		l1.next = l2;
		l2.next = l3;
		l3.next = null;
		ListNode l4 = new ListNode(5);
		ListNode l5 = new ListNode(6);
		ListNode l6 = new ListNode(4);
		l4.next = l5;
		l5.next = l6;
		l6.next = null;
		System.out.println("输入:"+"("+l1.val+"->"+l2.val+"->"+l3.val+")"+"+"+"("+l4.val +"->"+l5.val+"->"+l6.val+")");
		System.out.print("输出:");
		printList(addTwoNumbers(l1, l4));
	}

完整版:


class ListNode {
	public int val;
	public ListNode next;

	public ListNode(int i) {
		this.val = i;
	}

	public int val() {
		return val;
	}
}

public class 两数相加 {
	public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
		ListNode l4 = new ListNode(0);
		ListNode l3 = new ListNode(0);
		l4.next = l3;

		while (l1 != null || l2 != null) {
			int val1 = l1 == null ? 0 : l1.val;
			int val2 = l2 == null ? 0 : l2.val;
			// 创建新的结点
			ListNode l5 = new ListNode(0);
			// 进位
			l5.val = (val1 + val2 + l3.val) / 10;
			// 当前位
			l3.val = (val1 + val2 + l3.val) % 10;

			// 如果是最后一次循环,且最后一位为0,那么就要除去这个结点
			if (l5.val == 0 && (l1 != null ? l1.next : null) == null && (l2 != null ? l2.next : null) == null) {
				l3.next = null;
			} else {
				l3.next = l5;
				l3 = l5;
			}

			// 跳转指针
			l1 = l1 == null ? null : l1.next;
			l2 = l2 == null ? null : l2.next;
		}
		return l4.next;
	}

	public static void printList(ListNode l) {
		while (l != null) {
			System.out.print(l.val);
			System.out.print("->");
			l = l.next;
		}
	}

	public static void main(String[] args) {
		ListNode l1 = new ListNode(2);
		ListNode l2 = new ListNode(4);
		ListNode l3 = new ListNode(3);
		l1.next = l2;
		l2.next = l3;
		l3.next = null;
		ListNode l4 = new ListNode(5);
		ListNode l5 = new ListNode(6);
		ListNode l6 = new ListNode(4);
		l4.next = l5;
		l5.next = l6;
		l6.next = null;
		System.out.println("输入:"+"("+l1.val+"->"+l2.val+"->"+l3.val+")"+"+"+"("+l4.val +"->"+l5.val+"->"+l6.val+")");
		System.out.print("输出:");
		printList(addTwoNumbers(l1, l4));
	}

}

输出:

LeetCode||两数相加--给定两个 非空 链表来表示两个非负整数。位数按照 逆序 方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。_第1张图片

 

你可能感兴趣的:(LeetCode)