题解 | #两个链表生成相加链表#

两个链表生成相加链表

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

思路与两个字符串大数相加是一样的,只不过链表无法直接从后向前遍历,那么先将链表反转,然后从前向后遍历相加,设置进位,遍历完成后再将结果链表反转。注意使用dummy_node。

/**
 * 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* reverse_list(ListNode* head){
        ListNode* pre=nullptr;
        ListNode* cur=head;
        while(cur!=nullptr){
            auto temp=cur->next;
            cur->next=pre;
            pre=cur;
            cur=temp;
        }
        return pre;
    }
    
    ListNode* addInList(ListNode* head1, ListNode* head2) {
        ListNode* dummy_head=new ListNode{-1};
        ListNode* cur=dummy_head;
        ListNode* p1=reverse_list(head1);
        ListNode* p2=reverse_list(head2);
        int carry=0;
        while(p1!=nullptr || p2!=nullptr){
            int a{},b{};
            if(p1==nullptr) a=0;
            else a=p1->val;
            if(p2==nullptr) b=0;
            else b=p2->val;
            int sum=a+b+carry;
            ListNode* new_node=new ListNode{sum%10};
            cur->next=new_node;
            cur=cur->next;
            carry=sum/10;
            if(p1==nullptr) p1=nullptr;
            else p1=p1->next;
            if(p2==nullptr) p2=nullptr;
            else p2=p2->next;
        }
        auto result=reverse_list(dummy_head->next);
        return result;
    }
};


全部评论

相关推荐

蚂蚁 基架java (n+6)*16 签字费若干
点赞 评论 收藏
分享
头像
11-09 12:17
清华大学 C++
out11Man:小丑罢了,不用理会
点赞 评论 收藏
分享
10-10 17:54
点赞 评论 收藏
分享
在努力的外卷侠很靠谱:怎么,大家都没保底吗?我这美团已经入职了,不说了,系统派单了。
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务