码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode 2.两数相加

时间:2019-12-27 00:04:32      阅读:55      评论:0      收藏:0      [点我收藏+]

标签:包含   code   没有   地址   考研   res   简单   +=   适应   

题意

给出两个非空的链表用来表示两个非负的整数,他们的位数是按照逆序存储的,每个结点存储一位数字。求他们相加后的结果(用链表表示)。

思路

  • 直接模拟。因为是逆序给出的所以直接遍历一遍按位相加就好了,实现过程中用一个变量记录进位情况。时间复杂度\(O(max(m, n))\)

代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode res(0), *p = &res, *newp;
        int sum, carry = 0;
        while(l1 != NULL || l2 != NULL || carry)
        {
            sum = 0;
            if(l1 != NULL)  sum += l1 -> val;
            if(l2 != NULL)  sum += l2 -> val;
            sum += carry;
            carry = sum / 10;

            newp = new ListNode(sum % 10);
            p->next = newp;
            p = newp;

            l1 = l1 ? l1 -> next : NULL;
            l2 = l2 ? l2 -> next : NULL;
        }

        return res.next;
    }
};

总结

关于访问ListNode里的成员时,是用.直接访问还是用->呢?答:当当前变量是一个实体成员(如上面代码中定义的res)时用.,因为它包含了成员;当是一个指针时,用->,因为它只是指向一个指向地址的指针,并没有实体。

自己的联想——如果给出的是从高位到低位存的呢?可以先将两个链表都逆置一下,然后再进行上面的操作。写到这又想到了备战考研期间看的王道数据结构这本书上的问题,之前打ACM时解决的问题和书上给出的考试要考的内容有挺大差别的,一开始有些不适应,觉得这么简单还用写?。不过后来习惯后觉得还挺巧妙的,其中印象较为深刻的就有对链表的逆置操作(将前一半元素和后一半元素交换位置转化为了先整体逆置、再对前半部分逆置、再对后半部分逆置)。

LeetCode 2.两数相加

标签:包含   code   没有   地址   考研   res   简单   +=   适应   

原文地址:https://www.cnblogs.com/songjy11611/p/12104943.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!