0002 两数相加——张寒之の力扣笔记

中等难度,死磕了5个小时,到后来已经没办法思考了,就是不断加分支。后来休息了一会,回来重新写,用了几个分支就解决了。

这道题用到了链表操作,搜索了一下链表的相关函数,发现不能用,然后发现了代码中有相关的提示,如下图
image.png

也就是说只有一个值(val),一个指针(next),和一个初始化函数(ListNode(int x))。

链表的遍历一般要新建一个用于遍历的指针,这样能保证留着一个链表最初的入口。遍历的判定条件一般是node->next != NULL,但是这样就出现一个问题,就是循环结束后还停留在最后一个节点上,还需要再走一遍流程。但是如果不这样做,把判定条件改成当前指针 node != NULL,就没有办法和后面的链表拼接。

最后的解题思路就是对应位和变量ret相加,对10取商赋值给ret,对10取余留在当前位。做了三个分支,分别是l1和l2一样长,l1长,l2长,每个分支都有return。感觉还是挺麻烦的。文志python的思路不错,给短的链表补0再相加,但是还没想好在C++里怎么用。

代码如下

class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        int ret = 0;
        int sum = 0;
        ListNode* l1_ptr = l1;
        ListNode* l2_ptr = l2;
        while(1){
            if((l1_ptr->next != NULL) && (l2_ptr->next != NULL)){
                sum = l1_ptr->val + l2_ptr->val + ret;
                l1_ptr->val = sum % 10;
                ret = sum / 10;
                l1_ptr = l1_ptr->next;
                l2_ptr = l2_ptr->next;
            }else if((l1_ptr->next == NULL) && (l2_ptr->next == NULL)){
                sum = l1_ptr->val + l2_ptr->val + ret;
                l1_ptr->val = sum % 10;
                ret = sum / 10;
                if(ret == 1){
                    l1_ptr->next = new ListNode(1);
                }
                return l1;
            }else if((l1_ptr->next == NULL) && (l2_ptr->next != NULL)){
                sum = l1_ptr->val + l2_ptr->val + ret;
                l1_ptr->val = sum % 10;
                ret = sum / 10;
                l1_ptr->next = l2_ptr->next;
                l1_ptr = l1_ptr->next;
                while(l1_ptr->next != NULL){
                    if(ret == 0)
                        break;
                    sum = l1_ptr->val + ret;
                    l1_ptr->val = sum % 10;
                    ret = sum / 10;
                    l1_ptr = l1_ptr->next;
                }
                sum = l1_ptr->val + ret;
                l1_ptr->val = sum % 10;
                ret = sum / 10;
                if(ret == 1){
                    l1_ptr->next = new ListNode(1);
                }
                return l1;
            }else if((l2_ptr->next == NULL) && (l1_ptr->next != NULL)){
                sum = l1_ptr->val + l2_ptr->val + ret;
                l1_ptr->val = sum % 10;
                ret = sum / 10;
                l1_ptr = l1_ptr->next;
                while(l1_ptr->next != NULL){
                    if(ret == 0)
                        break;
                    sum = l1_ptr->val + ret;
                    l1_ptr->val = sum % 10;
                    ret = sum / 10;
                    l1_ptr = l1_ptr->next;
                }
                sum = l1_ptr->val + ret;
                l1_ptr->val = sum % 10;
                ret = sum / 10;
                if(ret){
                    l1_ptr->next = new ListNode(1);
                }
                return l1;
            }
        }
    }
};

最后结果还不错,但是这么做有刷代码行数的嫌疑

image.png

你可能感兴趣的:(0002 两数相加——张寒之の力扣笔记)