博主渣渣一枚,刷刷leetcode给自己瞅瞅,大神们由更好方法还望不吝赐教。题目及解法来自于力扣(LeetCode),传送门。
算法:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
一开始的思路很简单,其实就是对应位置上的数字相加,如果有进位那就再下个位置上+1,其实就是普通的加法。
public ListNode AddTwoNumbers(ListNode l1, ListNode l2) { var value = (l1.val + l2.val) % 10; var flag = (l1.val + l2.val) / 10 > 0; var result = new ListNode(value); var returnResult = result; if (flag) { result.next = new ListNode(1); } var a = l1.next; var b = l2.next; while (a != null || b != null) { var temp = (a != null ? a.val : 0) + (b != null ? b.val : 0) + (result.next != null ? result.next.val : 0); var addNums = temp % 10; var addFlag = temp / 10 > 0; if (result.next == null) { result.next = new ListNode(addNums); } else { result.next.val = addNums; } a = a!=null ? a.next : null; b = b!=null ? b.next : null; result = result.next; if (addFlag) { result.next = new ListNode(1); } } return returnResult; }
二,略微整理了一下,把第一次的判断免去了。这里要小心一下指向的问题,ListNode是一个引用类型,其实指向的是存在堆内存的地址。所以一开始的result与returnResult其实是指向的同一个地址。这样为next赋值时要小心,如果一开始给的值是null,会导致链表断掉。
public ListNode AddTwoNumbers(ListNode l1, ListNode l2) { ListNode result = new ListNode(0); var returnResult = result; var a = l1; var b = l2; while (a != null || b != null) { var temp = (a != null ? a.val : 0) + (b != null ? b.val : 0) + (result.next != null ? result.next.val : 0); var addNums = temp % 10; var addFlag = temp / 10 > 0; result.next = new ListNode(addNums); result = result.next; a = a!=null ? a.next : null; b = b!=null ? b.next : null; if (addFlag) { result.next = new ListNode(1); } } return returnResult.next; }