zoukankan      html  css  js  c++  java
  • 221. Add Two Numbers II【medium】

    You have two numbers represented by a linked list, where each node contains a single digit. The digits are stored in forward order, such that the 1's digit is at the head of the list. Write a function that adds the two numbers and returns the sum as a linked list.

     
    Example

    Given 6->1->7 + 2->9->5. That is, 617 + 295.

    Return 9->1->2. That is, 912.

    解法一:

     1 class Solution {
     2 public:
     3     /**
     4      * @param l1: the first list
     5      * @param l2: the second list
     6      * @return: the sum list of l1 and l2 
     7      */
     8     ListNode *addLists2(ListNode *l1, ListNode *l2) {
     9         reverse(l1);
    10         reverse(l2);
    11         ListNode *dummy = new ListNode(0);
    12         ListNode *tail = dummy;
    13         int carry = 0;
    14 
    15         while (l1 != NULL || l2 != NULL) {
    16             int sum = carry;
    17             if (l1 != NULL) {
    18                 sum += l1->val;
    19                 l1 = l1->next;
    20             }
    21             if (l2 != NULL) {
    22                 sum += l2->val;
    23                 l2 = l2->next;
    24             }
    25             if (sum > 9) {
    26                 carry = 1;
    27                 sum -= 10; 
    28             } else {
    29                 carry = 0;
    30             }
    31             tail->next = new ListNode(sum);
    32             tail = tail->next;
    33         }
    34 
    35         if (carry == 1) {
    36             tail->next = new ListNode(1);
    37             tail = tail->next;
    38         }
    39 
    40         reverse(dummy->next);
    41 
    42         return dummy->next;
    43     }
    44 
    45 
    46     void reverse(ListNode *&head) {
    47         ListNode *prev = NULL;
    48 
    49         while (head != NULL) {
    50             ListNode *temp = head->next;
    51             head->next = prev;
    52             prev = head;
    53             head = temp;
    54         }
    55 
    56         head = prev;
    57     }
    58 };

    链表先翻转,再求和,然后再翻转

    解法二:

     1 public class Solution {  
     2     /** 
     3      * @param l1: the first list 
     4      * @param l2: the second list 
     5      * @return: the sum list of l1 and l2  
     6      */  
     7     public ListNode addLists2(ListNode l1, ListNode l2) {  
     8         Stack<Integer> temp1 = reverseNode(l1);  
     9         Stack<Integer> temp2 = reverseNode(l2);  
    10 
    11         ListNode point = new ListNode(0);  
    12         int flag = 0;  
    13 
    14         while((!temp1.isEmpty()) && (!temp2.isEmpty())){  
    15             int value = temp1.pop() + temp2.pop() + flag;  
    16             flag = value / 10;  
    17             value = value % 10;  
    18             ListNode cur = new ListNode(value);  
    19             cur.next = point.next;  
    20             point.next = cur;  
    21         }  
    22 
    23         while(!temp1.isEmpty()){  
    24             int value = temp1.pop() + flag;  
    25             flag = value / 10;  
    26             value = value % 10;  
    27             ListNode cur = new ListNode(value);  
    28             cur.next = point.next;  
    29             point.next = cur;  
    30         }  
    31 
    32         while(!temp2.isEmpty()){  
    33             int value = temp2.pop() + flag;  
    34             flag = value / 10;  
    35             value = value % 10;  
    36             ListNode cur = new ListNode(value);  
    37             cur.next = point.next;  
    38             point.next = cur;  
    39         }  
    40 
    41         if(flag == 1){  
    42             ListNode cur = new ListNode(1);  
    43             cur.next = point.next;  
    44             point.next = cur;  
    45         }  
    46 
    47         return point.next;  
    48     }  
    49      
    50  
    51     public Stack<Integer> reverseNode(ListNode temp){  
    52         Stack<Integer> record = new Stack<Integer>();  
    53 
    54         while(temp != null){  
    55             record.push(temp.val);  
    56             temp = temp.next;  
    57         }  
    58 
    59         return record;  
    60     }  
    61 }  

    利用栈的先进后出,记录两个链表的节点值。然后计算对应位置的两个数字之和,如果有进位,赋值给flag并带入下一个计算。

    参考@sunday0904 的代码

  • 相关阅读:
    vs项目属性中的包含目录和库目录以及附加依赖项全都配置正确了,却还是提示:无法解析的外部符号
    开发六年mybatisplus使用小结
    去“BAT”这样面试,拿到offer的几率是80%
    阿里P7级教你如何在Spring Boot应用程序中使用Redis
    为什么Java大数据能带你走上人生巅峰
    惊呆!Java程序员等级一览
    不要做一个只会面向搜索编程的程序员
    三年总结出来的11个JPA和Hibernate查询配置小技巧
    阿里高级架构师教你使用Spring JMS处理消息事务源码案例
    阿里高级架构师教你使用Spring Cloud Sleuth跟踪微服务
  • 原文地址:https://www.cnblogs.com/abc-begin/p/8151240.html
Copyright © 2011-2022 走看看