题目
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
解答
/*** 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 value = new ListNode(0);ListNode v1 = l1;ListNode v2 = l2;ListNode p = value;ListNode v = value;int j = 0;while (v1 != null && v2 != null) {if (v == null) {v = new ListNode(0);p.next = v;}v.val = v1.val + v2.val + j;if (v.val > 9) {j = 1;v.val -= 10;}else {j = 0;}v1 = v1.next;v2 = v2.next;p = v;v = v.next;}if (v1 == null && v2 == null) {if (j > 0) {v = new ListNode(0);p.next = v;v.val = j; }}if (v1 != null && v2 == null) {while (v1 != null) {if (v == null) {v = new ListNode(0);p.next = v;}v.val = v1.val + j;if (v.val > 9) {j = 1;v.val -= 10;}else {j = 0;}v1 = v1.next;p = v;v = v.next;}if (j > 0) {v = new ListNode(0);p.next = v;v.val = j; }}if (v1 == null && v2 != null) {while (v2 != null) {if (v == null) {v = new ListNode(0);p.next = v;}v.val = v2.val + j;if (v.val > 9) {j = 1;v.val -= 10;}else {j = 0;}v2 = v2.next;p = v;v = v.next;}if (j > 0) {v = new ListNode(0);p.next = v;v.val = j; }}return value;}
}
要点
本题主要考查对单链表的理解和使用,比如在使用链表时,需要记录头指针、当前节点的父节点和当前节点。
对于问题本身,需要考虑两数位数相同,或者不同的场景。
我给出的解答不是很精简,在处理两数位数不同时,存在优化空间。