资讯专栏INFORMATION COLUMN

leetcode445. Add Two Numbers II

DoINsiSt / 2694人阅读

摘要:题目要求对以链表形式的两个整数进行累加计算。思路一链表转置链表形式跟非链表形式的最大区别在于我们无法根据下标来访问对应下标的元素。因此这里通过先将链表转置,再从左往右对每一位求和来进行累加。通过栈可以实现先进后出,即读取顺序的转置。

题目要求
You are given two non-empty linked lists representing two non-negative integers. The most significant digit comes first and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.

You may assume the two numbers do not contain any leading zero, except the number 0 itself.

Follow up:
What if you cannot modify the input lists? In other words, reversing the lists is not allowed.

Example:

Input: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 8 -> 0 -> 7

对以链表形式的两个整数进行累加计算。

思路一:链表转置

链表形式跟非链表形式的最大区别在于我们无法根据下标来访问对应下标的元素。假如我们希望从后往前对每个位置求和,则必须每次都从前往后访问到对应下标的值才可以。因此这里通过先将链表转置,再从左往右对每一位求和来进行累加。

链表的转置的方法如下:

假设链表为1->2->3
则为其设置一个伪头:dummy->1->2->3, 并且记录当前需要交换的元素为cur
则每次转置如下:
dummy->1(cur)->2->3
dummy->2->1(cur)->3
dummy->3->2->1(cur)

代码如下:

    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode rl1 = reverse(l1);
        ListNode rl2 = reverse(l2);
        ListNode result = new ListNode(0);
        int carry = 0;
        while(rl1 != null || rl2 != null || carry != 0) {
            int add = (rl1 == null ? 0 : rl1.val)
                    + (rl2 == null ? 0 : rl2.val)
                    + carry;
            carry = add / 10;
            ListNode tmp = new ListNode(add % 10);
            tmp.next = result.next;
            result.next = tmp;
            rl1 = rl1==null? rl1 : rl1.next;
            rl2 = rl2==null? rl2 : rl2.next;
        }
        return result.next;
    }
    
    public ListNode reverse(ListNode l) {
        ListNode dummy = new ListNode(0);
        dummy.next = l;
        ListNode cur = l;
        while(cur!= null && cur.next != null) {
            ListNode next = cur.next;
            cur.next = next.next;
            next.next = dummy.next;
            dummy.next = next;
        }
        return dummy.next;
    }
思路二: 栈

如果不希望改变链表的结构,那么用什么方式来将链表中的元素按照倒序读取呢?这时候就可以很快的联想到栈这个结构。通过栈可以实现先进后出,即读取顺序的转置。代码如下:

    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        Stack s1 = new Stack();
        Stack s2 = new Stack();
        while(l1 != null) {
            s1.push(l1.val);
            l1 = l1.next;
        };
        while(l2 != null) {
            s2.push(l2.val);
            l2 = l2.next;
        }
        
        int carry = 0;
        ListNode result = new ListNode(0);
        while(!s1.isEmpty() || !s2.isEmpty() || carry != 0) {
            int add = (s1.isEmpty() ? 0 : s1.pop())
                    + (s2.isEmpty() ? 0 : s2.pop())
                    + carry;
            carry = add / 10;
            ListNode tmp = new ListNode(add % 10);
            tmp.next = result.next;
            result.next = tmp;
        }
        return result.next;
    }

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/74538.html

相关文章

  • [LeetCode] 445. Add Two Numbers II

    Problem You are given two non-empty linked lists representing two non-negative integers. The most significant digit comes first and each of their nodes contain a single digit. Add the two numbers and ...

    alexnevsky 评论0 收藏0
  • LeetCode 167:两数之和 II - 输入有序数组 Two Sum II - Input a

    摘要:公众号爱写给定一个已按照升序排列的有序数组,找到两个数使得它们相加之和等于目标数。函数应该返回这两个下标值和,其中必须小于。示例输入输出解释与之和等于目标数。 公众号: 爱写bug(ID:icodebugs) 给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。 函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。...

    张春雷 评论0 收藏0
  • LeetCode 167:两数之和 II - 输入有序数组 Two Sum II - Input a

    摘要:公众号爱写给定一个已按照升序排列的有序数组,找到两个数使得它们相加之和等于目标数。函数应该返回这两个下标值和,其中必须小于。示例输入输出解释与之和等于目标数。 公众号: 爱写bug(ID:icodebugs) 给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。 函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。...

    Me_Kun 评论0 收藏0
  • leetcode 167 Two Sum II - Input array is sorted

    摘要:同时题目假设每组输入恰好只有一个答案,并且不能重复使用同一元素。理解这道题是可以用两层循环蛮力解决的,但是效率太低了。如果这两个元素和大于目标数组,指针左移如果小于,指针右移。如果等于,则返回这两个元素的位置记得用数组的数值加一解法 题目详情 Given an array of integers that is already sorted in ascending order, fi...

    Keagan 评论0 收藏0
  • leetcode 部分解答索引(持续更新~)

    摘要:前言从开始写相关的博客到现在也蛮多篇了。而且当时也没有按顺序写现在翻起来觉得蛮乱的。可能大家看着也非常不方便。所以在这里做个索引嘻嘻。顺序整理更新更新更新更新更新更新更新更新更新更新更新更新更新更新更新更新 前言 从开始写leetcode相关的博客到现在也蛮多篇了。而且当时也没有按顺序写~现在翻起来觉得蛮乱的。可能大家看着也非常不方便。所以在这里做个索引嘻嘻。 顺序整理 1~50 1...

    leo108 评论0 收藏0

发表评论

0条评论

DoINsiSt

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<