链表相加
题目: 给定两个非空链表,存放的数据都是非负整数,并且都是按照逆序的方式进行存储,要求把这两个数字相加,并返回同样的链表。
LeetCode的题目描述都令人头大。直接写个例子。
假设有两个链表:
链表1: 2 —->>>> 4 —->>>> 3
链表2: 5 —->>>> 6 —->>>> 4
由于是逆序的,所以数字是 342和465
相加得到 342+465=807
所以返回的链表是 : 7 —->>>> 0 —->>>> 8
两个个位数相加,如果大于10 ,需要进1。。 所以,设置一个溢出位,如果遍历到的当前节点相加大于10, 则设置溢出位的值为1,在下一个节点相加之前,加上这个值。在计算这个溢出位时,可以直接通过sum/10 来计算, 因为,如果sum = num1 + num2 + carry(溢出位) 大于10, 则需要进1, 否则为 0.
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
|
class Solution { public ListNode addTwoNumbers(ListNode l1, ListNode l2) { ListNode l3 = new ListNode(); ListNode cursor = l3; int carry = 0; while (l1 != null || l2 != null || carry != 0) { int num1 = ( l1 == null ) ? 0 : l1.val; int num2 = ( l2 == null ) ? 0 : l2.val; int sum = num1 + num2 + carry; carry = sum /10; ListNode newNode = new ListNode(sum % 10); cursor.next = newNode; cursor = cursor.next; if (l1.next != null) l1 = l1.next; if (l2.next != null) l2 = l2.next; } return l3.next; } }
|
验证一下,手动创建两个链表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| public static void main(String[] args) { ListNode l1 = new ListNode(2); ListNode listNode1 = new ListNode(4); ListNode listNode2 = new ListNode(3); l1.next = listNode1; listNode1.next = listNode2;
ListNode l2 = new ListNode(5); ListNode listNode4 = new ListNode(6); ListNode listNode5 = new ListNode(4); l2.next = listNode4; listNode4.next = listNode5;
ListNode l3 = addNumbers(l1, l2); ListNode cursor = l3; while (cursor != null){ System.out.println(cursor.val); cursor = cursor.next; } }
|
输出结果如下