zoukankan      html  css  js  c++  java
  • leetcode2. 两数相加

    使用迭代的方式

    class Solution{
    public:
        ListNode *addTwoNumbers(ListNode* l1,ListNode *l2)
        {
            ListNode *res=new ListNode(-1);
            ListNode *p=res;
            int temp=0,increase=0;
            while(l1 && l2)
            {
                temp=l1->val+l2->val+increase;
                ListNode *r = new ListNode(-1);
                if(temp>=10)
                    increase=1;
                else
                    increase=0;
                r->val=temp%10;
                res->next=r;
                res=res->next;
                l1=l1->next;
                l2=l2->next;
            }
            while(l1)
            {
                ListNode *r = new ListNode(-1);
                temp=l1->val+increase;
                if(temp>=10)
                    increase=1;
                else
                    increase=0;
                r->val=temp%10;
                res->next=r;
                res=res->next;
                l1=l1->next;
            }
            
             while(l2)
            {
                ListNode *r = new ListNode(-1);
                temp=l2->val+increase;
                if(temp>=10)
                    increase=1;
                else
                    increase=0;
                r->val=temp%10;
                res->next=r;
                res=res->next;
                l2=l2->next;
            }
            if(increase==1)
            {
                ListNode *r = new ListNode(1);
                res->next=r;
            }
            return p->next;
            
        }
    
    };

    其实还有更简洁的书写方式,我上面是用了三个while,其实一个while就够了,如下,更加优雅,摘自Leetcode,侵删

    /**
     * Definition for singly-linked list.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode(int x) { val = x; }
     * }
     */
    class Solution {
        public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
            ListNode DummyHead = new ListNode(0); // 初始化一个伪头结点
            ListNode pre = DummyHead; // 用 pre 记录要创建并赋值的节点的前一个节点
            int Carry = 0;  // 初始化进位
            while( l1 != null || l2 != null || Carry > 0) // 继续相加的条件是 链表对应位置中存在不为空的节点 或 有进位
            {
                int sum = ((l1 != null) ? l1.val : 0) + ((l2 != null) ? l2.val : 0) + Carry; //计算对应位的和(需要加上进位)
                Carry = sum / 10; // 记录下次相加的进位
                pre.next = new ListNode(sum % 10); // 创建并赋值下个节点
                pre = pre.next; // pre 移动到新创建的节点位置上,便于下一轮继续创建新节点
    
                /* 当节点不为空的时候,指向它的下一个节点(之前判断的是其后节点是否为空,导致超时,因为与while的条件不匹配) */
                if(l1 != null)
                    l1 = l1.next;
                if(l2 != null)
                    l2 = l2.next;
            }
            return DummyHead.next; // 返回有数据的第一个节点,也就是伪节点的下一个节点
        }
    }
  • 相关阅读:
    Win32串口API
    Windows核心编程 第4章 进程
    大家都来吐槽下12306的网站bug吧
    HttpRequest模拟Post和Get提交代码
    jquery.masonry + jquery.infinitescroll 实现瀑布流布局
    三层架构之泛型应用
    listView 中,大图标时,各个图标之间间距的控制
    Windows Phone APP的设计过程
    分享三个小故事
    最值得创业者聆听的10大TED演讲(中文字幕视频)
  • 原文地址:https://www.cnblogs.com/renzmin/p/11882190.html
Copyright © 2011-2022 走看看