题解 | #链表相加(二)#

链表相加(二)

https://www.nowcoder.com/practice/c56f6c70fb3f4849bc56e33ff2a50b6b

暴力解法:将相加结果覆盖到链表head1上

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */

class Solution {
public:
    /**
     * 
     * @param head1 ListNode类 
     * @param head2 ListNode类 
     * @return ListNode类
     */
	 //反转链表
    ListNode* ReverseList(ListNode* pHead)
    {
        if(!pHead)
            return nullptr;
        ListNode* curr = pHead;
        ListNode* pre = nullptr;
        while(curr)
        {
            ListNode* temp = curr->next;
            curr->next = pre;
            pre = curr;
            curr = temp;
        }
        return pre;
    }
    ListNode* addInList(ListNode* head1, ListNode* head2) {
        // write code here
        head1 = ReverseList(head1);
        head2 = ReverseList(head2);
        ListNode* res = new ListNode(0);
        res->next = head1;
        ListNode* pre = res;
        int ones = 0;
        int tens = 0;
        while(head1 && head2)
        {
            int sum = head1->val + head2->val + tens;
            ones = sum % 10;
            tens = sum / 10;
            head1->val = ones;
            head1 = head1->next;
            head2 = head2->next;
            pre = pre->next;
        }
        if(head2)
        {
            pre->next = head2;
            head1 = head2;
        }
        while(head1 && tens>0)
        {
            if(head1->next == nullptr)
                pre = head1;
            int sum = head1->val + tens;
            ones = sum % 10;
            tens = sum / 10;
            head1->val = ones;
            head1 = head1->next;
        }
        if(tens>0)
        {
            ListNode* end = new ListNode(tens);
            pre->next = end;    
        }
        return ReverseList(res->next);
    }
};

简洁写法

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */

class Solution {
public:
    /**
     * 
     * @param head1 ListNode类 
     * @param head2 ListNode类 
     * @return ListNode类
     */
	 //反转链表
    ListNode* ReverseList(ListNode* pHead)
    {
        if(!pHead)
            return nullptr;
        ListNode* curr = pHead;
        ListNode* pre = nullptr;
        while(curr)
        {
            ListNode* temp = curr->next;
            curr->next = pre;
            pre = curr;
            curr = temp;
        }
        return pre;
    }
    ListNode* addInList(ListNode* head1, ListNode* head2) {
        // write code here
        //简洁写法,用新的链表存储结果
        //任意一个链表为空,返回另一个
        if(head1 == nullptr)
            return head2;
        if(head2 == nullptr)
            return head1;
        //反转两个链表
        head1 = ReverseList(head1);
        head2 = ReverseList(head2);
        //添加表头
        ListNode* res = new ListNode(0);
        ListNode* head = res;
        //进位符号
        int carry = 0;
        //只要某个链表没有结束或者还有进位
        while(head1 || head2 || carry)
        {
            //链表不为空则取其值
            int val1 = (head1 == nullptr)?0:head1->val;
            int val2 = (head2 == nullptr)?0:head2->val;
            //相加
            int sum = val1 + val2 + carry;
            //获取进位
            carry = sum / 10;
            sum %= 10;
            //添加元素
            head->next = new ListNode(sum);
            head = head->next;
            //移动下一个
            if(head1)
                head1 = head1->next;
            if(head2)
                head2 = head2->next;
        }
        //结果反转回来
        return ReverseList(res->next);
    }
};

全部评论

相关推荐

09-19 19:43
已编辑
广东工业大学 golang
zizi哦:很牛了,稳大厂给几点建议:一、想被稳的问题,关键点,可以加深一点,一眼看过去全是文字,没事干容易抓不住重点;二、第一个开源项目很多人 star,这是一个证明你牛逼的证据,建议放在项目背景,开头就是这句话,背景到结果,并且重点标注;三、个人技能可以放后,没什么把握的可以不写上去,比如你列了这么多微服务中间件,你确定自己真的理解底层吗?如果不熟悉,可以表述为熟悉微服务体系开发,如 xxx 中间件;四、项目很多描述在讲述架构,有没有自己觉得亮点的设计,体现不出你解决问题的过程和思考。
如何写一份好简历
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务