2.5 Sum List

Q: numbers are stored in reverse order.
L1: 7->1->6 (716)
L2:5->9->2 (295)
L1 + L2 = 716 + 295 = 912
L3: 2->1->9.

    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2{
        ListNode* newHead = new ListNode(-1);
        ListNode* p = newHead;
        int carry = 0;
        while(l1 || l2 || carry){
            int sum = (l1? l1->val : 0) + (l2? l2->val : 0) + carry;
            p->next = new ListNode(sum%10);
            carry = sum/10;
            p = p->next;
            l1 ? l1=l1->next : 0;
            l2 ? l2=l2->next : 0;
        }
        return newHead->next;
    }

Follow up: what if numbers are stored in forward order?
Eg: (1->2->3->4) + (5->6->7)
Now the problem becomes a little bit more cumbersome. Firstly, if they have different length, we have to add zeroes in front of shorter list. Secondly, we have to find the carry from the last two sum. Following code solve this problem recursively.

    void insertFront(ListNode* &head, int value){
        ListNode* newHead = new ListNode(value);
        newHead->next = head;
        head = newHead;
    }

    void addZeroes(ListNode* &head, int len){
        for (int i = 0; i<len; ++i) {
            insertFront(head, 0);
        }
    }

    int length(ListNode* head){
        int len = 0;
        while(head){
            ++len;
            head = head->next;
        }
        return len;
    }

    ListNode* helper(ListNode* l1, ListNode* l2, int& carry){
        if(!l1 && !l2 && !carry) return nullptr;
        ListNode* res = helper(l1? l1->next : nullptr, l2 ? l2->next : nullptr, carry);
        int sum = (l1 ? l1->val : 0) + (l2 ? l2->val : 0) + carry;
        insertFront(res, sum % 10);
        carry = sum/10;
        return res;
    }

    ListNode* addTwoNumbers2(ListNode* l1, ListNode* l2){
        int len1 = length(l1), len2 = length(l2);
        (len1 < len2) ? addZeroes(l1, len2 - len1) : addZeroes(l2, len1 - len2);
        int carry = 0;
        ListNode* l3 = helper(l1, l2, carry);
        if (carry) insertFront(l3, carry);
        return l3;
    }

For testing:

    int main(int argc, const char * argv[]) {
        // insert code here...
        ListNode* list1 = nullptr;
        ListNode* list2 = nullptr;
        cout << "list stored in forward order: \n";
        //Node * listx = nullptr;
        insertFront(list1, 4);
        insertFront(list1, 3);
        insertFront(list1, 2);
        insertFront(list1, 9);
        cout << "List1:  ";
        printList(list1);

        insertFront(list2, 9);
        insertFront(list2, 9);
        insertFront(list2, 8);
        cout << "List2:  ";
        printList(list2);

        ListNode* list3 = addTwoNumbers2(list1, list2);
        cout << "Adding two above lists\n";
        cout << "List3:  ";
        printList(list3);
        return 0;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[3\]: clear;clc load data1 plot(x,y,'o') % 给x和y轴加上标签 xlabel('x的值') ylabel('y的值') n = size(x,1); k = (n*sum(x.*y)-sum(x)*sum(y))/(n*sum(x.*x)-sum(x)*sum(x)) b = (sum(x.*x)*sum(y)-sum(x)*sum(x.*y))/(n*sum(x.*x)-sum(x)*sum(x)) hold on % 继续在之前的图形上来画图形 grid on % 显示网格线 % % 画出y=kx+b的函数图像 plot(x,y) % % 传统的画法:模拟生成x和y的序列,比如要画出\[0,5\]上的图形 % xx = 2.5: 0.1 :7 % 间隔设置的越小画出来的图形越准确 % yy = k * xx + b % k和b都是已知值 % plot(xx,yy,'-') % 匿名函数的基本用法。 % handle = @(arglist) anonymous_function % 其中handle为调用匿名函数时使用的名字。 % arglist为匿名函数的输入参数,可以是一个,也可以是多个,用逗号分隔。 % anonymous_function为匿名函数的表达式。 % 举个小例子 % z=@(x,y) x^2+y^2; % z(1,2) % % ans = 5 % fplot函数可用于画出匿名一元函数的图形。 % fplot(f,xinterval) 将匿名函数f在指定区间xinterval绘图。xinterval = \[xmin xmax\] 表示定义域的范围 f=@(x) k*x+b; fplot(f,\[2.5,7\]); legend('样本数据','拟合函数','location','SouthEast') 拟合优度 要对拟合的函数 f(x)取舍(保证模型简洁性),拟合f(x)越简单,R^2越接近于1,结果越好。只有拟合函数是线性函数时,才采用拟合优度R^2来对拟合结果评价。线性函数与其他函数(如复杂的指数函数)比较时,采用SSE来对拟合好坏评价。\[3\] 问题: sum of sin function 回答: 对于求解sin函数的和,可以使用数值拟合的方法。首先,我们需要收集一组sin函数的样本数据。然后,可以使用拟合算法,如最小二乘法,来拟合这些数据点。拟合的结果可以表示为一个函数f(x),其中x是自变量。通过对这个函数进行求和,就可以得到sin函数的和。具体的计算步骤可以参考上述引用中的代码示例。 #### 引用[.reference_title] - *1* *2* *3* [拟合算法模型](https://blog.csdn.net/Lov1_BYS/article/details/125765022)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值