题目:
给定两个用链表表示的整数,每个节点包含一个数位。
这些数位是反向存放的,也就是个位排在链表首部。
编写函数对这两个整数求和,并用链表形式返回结果。
示例:
输入:(7 -> 1 -> 6) + (5 -> 9 -> 2),即617 + 295
输出:2 -> 1 -> 9,即912
进阶:假设这些数位是正向存放的,请再做一遍。
示例:
输入:(6 -> 1 -> 7) + (2 -> 9 -> 5),即617 + 295
输出:9 -> 1 -> 2,即912
分析:
从两个链表头节点开始遍历,计算两个节点值的和,记录进位,并将和%10处理作为新的节点,当两个链表都遍历完后,还要再判断一次是否有进位,有的话还要加一个为1的节点。
程序:
/** * 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 p1 = l1, p2 = l2; ListNode dummyHead = new ListNode(-1); ListNode p = dummyHead; int carry = 0; while(p1 != null || p2 != null){ int num1 = p1 != null ? p1.val : 0; int num2 = p2 != null ? p2.val : 0; int sum = num1 + num2 + carry; carry = sum / 10; sum %= 10; p.next = new ListNode(sum); p = p.next; if(p1 != null) p1 = p1.next; if(p2 != null) p2 = p2.next; } if(carry > 0){ p.next = new ListNode(carry); } return dummyHead.next; } }