LeetCode2.两数相加
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
题目精巧的设置成逆序存储的链表,正好对应加法中的从个位数开始相加的顺序,需要注意的是,在相加的过程中,不仅要记录当前位两个数字是否有进位,还需要记录上一次两数相加的进位情况。
对于长度不想等的两个链表,当为null时,将null补0来方便计算。
最后判断相加后,如果进位仍为1,就将进位插入到链表中,使用哑节点来进行返回。
public ListNode addTwoNumbers(ListNode l1, ListNode l2) { if (l1 == null && l2 == null) { return null; } //定义哑节点 ListNode dummyNode = new ListNode(-1); //定义前驱节点遍历链表 ListNode prevNode = dummyNode; //定义进位标志 1 -> 有进位 0 -> 无进位 int addOne = 0; while (l1 != null || l2 != null) { //为短链表进行补0操作 int x = l1 == null ? 0 : l1.val; int y = l2 == null ? 0 : l2.val; //每一次遍历都要 加上 之前是否有进位 int sum = x + y + addOne; //每一次遍历都记录是否有进位 addOne = sum / 10; //将实际数值放入链表 //7 + 8 = 15 进位为 1 实际值为 5 sum = sum % 10; prevNode.next = new ListNode(sum); //要进行补0操作,防止nullPointer if (l1 != null) { l1 = l1.next; } if (l2 != null) { l2 = l2.next; } prevNode = prevNode.next; } //如果遍历完毕后,addOne进位还为1,加入到链表 if (addOne == 1) { prevNode.next = new ListNode(addOne); } return dummyNode.next; }
学习的博客多用于在笔记中,防止笔记过于臃肿,所以将样例及运行结果放在博客中,后以超链接的形式记录在笔记中,所以有些博文过于单薄。如果有小伙伴遇到问题欢迎评论,看到就会回复,学渣一枚,加油努力。