leetcode 2. 两数相加(Java版)

2019-02-18  本文已影响0人  M_lear

题目描述(题目难度,中等)

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

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

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

示例代码

/**
 * 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 sum = new ListNode(0);
        sum.next = null;
        ListNode i = sum;
        //下面这个循环,将l1和l2两链表对应相加,较长的直接接在sum链表后面
        while(true){
            i.val = l1.val + l2.val;
            if (l1.next == null && l2.next == null) break;
            else if (l1.next == null){
                i.next = l2.next ;
                break;
            }else if (l2.next == null){
                i.next = l1.next;
                break;
            }else{
                l1 = l1.next;
                l2 = l2.next;
                i.next = new ListNode(0);
                i = i.next;
                i.next = null;
            }
        }
        i = sum;
        //负责将大于10的结点进行进位处理
        while(true){
            if(i.val >= 10){
                if(i.next != null){
                    i.val = i.val % 10;//取个位数
                    i = i.next;
                    i.val += 1;//应该要知道i.val不会超过19,所以直接进1即可,不需要判断十位
                }else{
                    i.val = i.val % 10;
                    i.next = new ListNode(1);
                    i.next.next = null;
                    break;
                }
            }else if(i.next == null) break;
            else    i = i.next;
        }
        return sum;
    }
}

思路解析

这个题目的本意是模拟大整数相加,是一个链表类问题。题目本身不是很难,链表类的题目最主要是要细心,注意,要保持结果链表尾结点的 next 指针为空。
题目也有注释,应该看起来不困难。整体的思路就是:

  1. 将输入的两链表,对应结点相加,先不考虑进位,否则代码要复杂得多,感兴趣的可以自己试一下,我也是试了之后才知道的(^&^)。这里要注意的点就是,两个链表极有可能不等长,所以不是一直对应结点相加下去就可以,还要判断是否某条链表已经走到末尾了,如果是则直接将令一链表的剩余结点,链到和链表里即可。
  2. 和链表中的结点很可能加成两位数了,此时再遍历一遍和链表进行进位即可。考虑极端情况,就算两个最大的个位数相加再加一个进位,也才 19。所以和链表结点里的值最大只能为 19。当需要进位时,只需要取出个位,而不用取十位,直接后结点加 1 即可。
上一篇下一篇

猜你喜欢

热点阅读