给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
遍历两个链表,有些同学写的代码很复杂,如先检查一个链表是否为空,然后分别遍历两个链表,之后再判断某个链表是否为空,代码写的很冗余,其实完全没有必要。
写对代码重要,show me simple code也很重要,其实一次遍历两个链表即可,思路很简单,需要定义临时变量x,y,p,q分别指向l1和l2,定义一个进位incry,要注意最终循环结束之后,如果incry不为0,需要增加一个节点。
基本思路:
- 初始化incry为0,初始化一个result节点,定义返回的头节点head指向result节点,定义两个临时节点p和q分别初始化为列表 l1和l2 的头部。
- 遍历l1和l2,直到两个链表都为空
- x设置为节点p的值,如果p为null,表示l1已经到末尾,则将x置为0。
- y设置为节点q的值,如果q为null,表示l2已经到末尾,则将y置为0。
- 设置value = x + y + incry。
- 创建value % 10的节点,result.next指向这个节点。
- 更新进位incry = incry / 10。
- 更新p,q,result节点。
- 检查incry是否不为0,如果是,则创建值为incry的节点,result.next指向这个节点。
- 返回head.next节点。
Talk is cheap, show me the code!
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode p1 = l1;
ListNode p2 = l2;
int incry = 0;
ListNode result = new ListNode(0);
ListNode head = result;
while(p1 != null || p2 != null) {
int x = p1 != null ? p1.val : 0;
int y = p2 != null ? p2.val : 0;
int value = x + y + incry;
result.next = new ListNode(value % 10);
incry = value / 10;
if (p1 != null) p1 = p1.next;
if (p2 != null) p2 = p2.next;
result = result.next;
}
if (incry != 0) {
ListNode newNode = new ListNode(incry);
result.next = newNode;
}
return head.next;
}
}
欢迎关注微信公众号: