• [Leetcode] Add two numbers 两数之和


    You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.

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

    题意:求以链表形式表示的两非负整数之和,高位在后。

    思路:联想数组形式的计算,以一个变量carry为对应位置的和,carry%10为当前值,carry/10为进位。在数组里,直接在长度较大的数组更新值就行,但是链表的长度没法直接获得。所以出现了问题一:如何保存数据。所以针对这个问题有两种解法,但求和的思想还是不变。问题二、若是最高位有进位,怎么办?这种情况下,只能新建一个结点,然后赋值。

    方法一:开辟一个新的链表,每次都是将对应的值赋给新开辟的结点。这就遇到循环条件的问题,若是l1&&l2则会遇到有其中一个链表遍历完时,剩下的链表的进位情况,若剩下的结点值全是9,即存在进位的可能则可能有需要另一个while循环,所以这里为代码的简洁还是用 l1||l2 。还有一点值得注意的是,对当前结点的取值一定要在当前结点存在的情况下,不然会造成错误。代码如下:

     1 /**
     2  * Definition for singly-linked list.
     3  * struct ListNode {
     4  *     int val;
     5  *     ListNode *next;
     6  *     ListNode(int x) : val(x), next(NULL) {}
     7  * };
     8  */
     9 class Solution {
    10 public:
    11     ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) 
    12     {
    13         if(l1==NULL)    return l2;
    14         if(l2==NULL)    return l1;
    15 
    16         int carry=0;
    17         ListNode *nList=new ListNode(-1);
    18         ListNode *pre=nList;
    19 
    20         while(l1||l2)
    21         {
    22             if(l1)
    23             {
    24                 carry+=l1->val;
    25                 l1=l1->next;
    26             }
    27             if(l2)
    28             {
    29                 carry+=l2->val;
    30                 l2=l2->next;
    31             }
    32 
    33             pre->next=new ListNode(carry%10);
    34             carry/=10;
    35             pre=pre->next;
    36         }    
    37 
    38         if(carry==1)
    39             pre->next=new ListNode(1);
    40         
    41         return nList->next;
    42     }
    43 };

    方法二:参考数组的做法,先找出较长的,然后更新较长链表上结点的值。参考LeetCode上的讨论

     1 /**
     2  * Definition for singly-linked list.
     3  * struct ListNode {
     4  *     int val;
     5  *     ListNode *next;
     6  *     ListNode(int x) : val(x), next(NULL) {}
     7  * };
     8  */
     9 class Solution {
    10 public:
    11     ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) 
    12     {
    13         int flag=0;
    14         int sum=0;
    15         ListNode *pointer1=l1;
    16         ListNode *pointer2=l2;
    17         ListNode *result=NULL;
    18         while(pointer1&&pointer2)
    19         {
    20             pointer1=pointer1->next;
    21             pointer2=pointer2->next;
    22         }
    23         if(pointer1==NULL)
    24             result=l2;
    25         else
    26             result=l1;
    27 
    28         ListNode *nList=result;
    29 
    30         while(l1||l2)
    31         {
    32             sum=(l1?l1->val:0)+(l2?l2->val:0)+flag;
    33             flag=sum/10;
    34             result->val=sum%10;
    35             l1?l1=l1->next:l1;
    36             l2?l2=l2->next:l2;
    37             result->next?result=result->next:result;    //值得注意必须先判断存在,
    38         }                                               //思考,若存在进位,和下面的代码会产生什么后果
    39         if(flag==1)
    40         {
    41             result->next=new ListNode(1);
    42         }
    43 
    44         return nList;
    45     }
    46 };
  • 相关阅读:
    Python一键安装缺失库
    Python画樱花树❀
    Python时间模块time
    Python的画五角星
    力扣225.用队列实现栈
    STL是个啥?
    如何使用递归遍历对象获得value值
    JS操作未跨域iframe里的DOM
    CSS3D效果
    前端轮播小结
  • 原文地址:https://www.cnblogs.com/love-yh/p/7047527.html
Copyright © 2020-2023  润新知