LeetCode笔记——2两数相加

题目:

给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。

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

示例:

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

思路:基本上和之前做的加法相同,但是是链表结构有一些要注意的地方。比如说是出现空链表,两个链表长度不相等,进位如何处理。还有就是如何遍历链表。有很多细节要注意。以下是leetcode中的代码。

再一次做这个题,还是要几点没有考虑到:(1)没有考虑到两个数的位数可能是不一样的(2)没有考虑到最高位的进位是怎样计算(3)对链表的操作还是不熟悉,比如说最开始会创建一个空的节点tm,然后将其引用传递给一个节点d,利用节点d 一个一个往后进行操作,最后d会到达结果的最后一位,返回的时候返回tem节点的下一个节点。

代码:

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode tem1=l1;
        ListNode tem2=l2;
        ListNode tm=new ListNode(0);    //创建一个节点,赋值为0;
        ListNode d=tm;
        int c=0;
        while(tem1!=null||tem2!=null)
        {
            int x=(tem1==null?0:tem1.val);  //若当前节点为空,则返回0值
            int y=(tem2==null?0:tem2.val);
            int sum=x+y+c;
            c=sum/10;   //进位除以10
            d.next=new ListNode(sum%10);  //下一位对10 取余数,注意赋值给d的下一个节点,注意节点的新建写法
            d=d.next;
            if(tem1!=null)
                tem1=tem1.next;
            if(tem2!=null)
                tem2=tem2.next;
         }
        if(c>0)  //最后进位的处理
            d.next=new ListNode(c);
        return tm.next;  //注意最后返回的是tm的下一个节点,不是d
    }
}

复杂度:

复杂度分析

  • 时间复杂度:O(max(m,n))O(\max(m, n))O(max(m,n)),假设 mmm 和 nnn 分别表示 l1l1l1 和 l2l2l2 的长度,上面的算法最多重复 max(m,n)\max(m, n)max(m,n) 次。

  • 空间复杂度:O(max(m,n))O(\max(m, n))O(max(m,n)), 新列表的长度最多为 max(m,n)+1\max(m,n) + 1max(m,n)+1。

你可能感兴趣的:(LeetCode笔记)