• 2_Add Two Numbers --LeetCode


    原题如下:

    思路:在一个while中遍历两个链表,直到最长的链表为空,或者没有进位。每一步获取两个链表对应的结点的值a,b,然后相加a+b。如果上一步又进位,那就加a+b+1,若由于进位加1后还产生进位,则设置进位标识位为true。如果a+b大于9,也要设置进位标识为true。

    代码如下:

     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(NULL==l1 && NULL==l2)
    14         {
    15             ListNode* LN = (ListNode*)malloc(sizeof(ListNode));
    16             LN->val = 0;
    17             LN->next = NULL;
    18             return LN;
    19         }
    20         
    21         if(NULL == l2 && NULL !=l1)
    22             return l1;
    23         
    24         if(NULL == l1 && NULL !=l2)
    25             return l2;
    26         
    27         bool carry = false; //进位标识符
    28         ListNode* p = l1,*q = l2,* L = NULL,*s = NULL,*pl;
    29         
    30         //创建头结点,后面会删除掉。
    31         if(!(L = (ListNode*)malloc(sizeof(ListNode))))
    32            return L;
    33         L->val = 0;
    34         L->next = NULL;
    35         pl = L;
    36         while(p!=NULL || q!=NULL || carry)
    37         {
    38             
    39             int pos1=0,pos2=0,remain=0, sum = 0;
    40             
    41             //以下两个if是获取两个链表中的值
    42             if(p!=NULL)
    43             {
    44                 pos1 = p->val;
    45                 p=p->next;
    46             }  
    47             
    48             if(q!=NULL)
    49             {
    50                 pos2 = q->val;
    51                 q=q->next;
    52             }
    53             
    54             //相加
    55             sum = pos1+pos2;
    56             //求余
    57             remain = sum%10;
    58             //创建结点
    59             if(!(s = (ListNode*)malloc(sizeof(ListNode))))
    60                 return s;
    61             //如果上一步又进位
    62             if(carry){
    63                 //再次判断进位后是否还进位
    64                 if(remain+1>9){
    65                     s->val=0;
    66                     carry = true;
    67                 }else{
    68                     s->val = remain+1;
    69                     carry = false;
    70                 }
    71                 
    72             }else
    73                 s->val=remain;
    74             //添加结点到链表中
    75             s->next = NULL;
    76             pl->next = s;
    77             pl = s;
    78             
    79             //判断是否进位
    80             if(sum>9)
    81                 carry = true; 
    82         }
    83       
    84         //删除结点
    85         pl = L;
    86         L = L->next;
    87         free(pl);
    88         
    89         return L;
    90     }
    91 };
  • 相关阅读:
    个人亲历运维面试
    《Kubernetes进阶实战》之管理Pod资源对象
    Docker容器必备技能 -- iptables
    vue后台管理权限正确思路
    Axios 各种请求方式传递参数格式
    Cookie的使用(js-cookie插件)
    微信小程序template模板与component组件的区别和使用
    如何机智地回答浏览器兼容性问题
    webpack系列5:源码流程,webpack编译流程
    webpack系列4:文件分析.
  • 原文地址:https://www.cnblogs.com/houjun/p/8335123.html
Copyright © 2020-2023  润新知