zoukankan      html  css  js  c++  java
  • 【Leetcode】445. Add Two Numbers II

    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
    

    Tips:给定两个单链表,将两个单链表中的值相加。

    思路:链表都是按照从前到后连接的,而整数加法需要从低位开始相加,即链表的后面开始相加。

    我才用两个list来保存链表的val,按照从后向前的顺序相加,并将结果保存在一个list中。最后将list按照从后向前的顺序,赋值给一个新的链表。

    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
            List<Integer> list1 = new ArrayList<>();
            List<Integer> list2 = new ArrayList<>();
            while (l1 != null) {
                list1.add(l1.val);
                l1 = l1.next;
            }
            while (l2 != null) {
                list2.add(l2.val);
                l2 = l2.next;
            }
            int len1 = list1.size();
            int len2 = list2.size();
            //将较长的链表保存在list1中
            if (len1 < len2) {
                List<Integer> temp = list2;
                list2 = list1;
                list1 = temp;
            }
            int len = len1 > len2 ? len1 : len2;// 最后链表的长度为len或者len+1
            System.out.println(len);
            List<Integer> list = new ArrayList<>();
            int diff = Math.abs(len1 - len2);
            int tag = 0;
            //从后向前进行整数加法。
            for (int i = len - 1; i >= 0; i--) {
                //如果两个链表长度不相等,保证右对齐  ,先将能对其的位置相加.剩下的位置只加list1即可
                int temp = tag + list1.get(i);
                if (i - diff >= 0) {
                    temp += list2.get(i - diff);
                }
                if (temp >= 10) {
                    //进1
                    tag = 1;
                    temp -= 10;
                } else {
                    tag = 0;
                }
                list.add(temp);
            }
            if (tag > 0)
                list.add(1);
            //打印list中的值
            for (int i = 0; i < list.size(); i++) {
                System.out.println(list.get(i));
            }
            ListNode head = new ListNode(-1);
            ListNode node = new ListNode(0);
            head.next = node;
            //将list从后向前 赋值给链表结点
            for (int i = list.size() - 1; i >= 0; i--) {
                node.next = new ListNode(list.get(i));
                node = node.next;
            }
            node.next = null;
            return head.next.next;
        }

    测试代码:

    public static void main(String[] args) {
            ListNode node1 = new ListNode(7);
            ListNode node2 = new ListNode(2);
            ListNode node3 = new ListNode(4);
            ListNode node4 = new ListNode(3);
            node1.next = node2;
            node2.next = node3;
            node3.next = node4;
            ListNode nu = null;
            node4.next = nu;
    
            ListNode node11 = new ListNode(5);
            ListNode node21 = new ListNode(6);
            ListNode node31 = new ListNode(4);
            node11.next = node21;
            node21.next = node31;
            ListNode nu1 = null;
            node31.next = nu1;
            L445AddTwoNumbersII l445 = new L445AddTwoNumbersII();
            ListNode head = l445.addTwoNumbers(node11, node1);
            while (head != null) {
                System.out.println("~~~~~~~~~~~~");
                System.out.println(head.val);
                head = head.next;
            }
    }
  • 相关阅读:
    详解快速排序算法
    json和字符串、数组
    晚上回去搞这个
    json2使用方法
    mysql格式化时间函数:FROM_UNIXTIME
    java链接sqlite
    第七章 闭包
    产品家:你的闷骚,我的产品!
    关于json的格式
    JQuery选择器$()的工作原理浅析
  • 原文地址:https://www.cnblogs.com/yumiaomiao/p/8463921.html
Copyright © 2011-2022 走看看