leetcode腾讯精选50题每日一题(#2 两数相加)

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 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,直到两个链表都为空
  1. x设置为节点p的值,如果p为null,表示l1已经到末尾,则将x置为0。
  2. y设置为节点q的值,如果q为null,表示l2已经到末尾,则将y置为0。
  3. 设置value = x + y + incry。
  4. 创建value % 10的节点,result.next指向这个节点。
  5. 更新进位incry = incry / 10。
  6. 更新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;
    }
}

欢迎关注微信公众号:

发布了35 篇原创文章 · 获赞 81 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/chanllenge/article/details/89397713