NC40 两个链表生成相加链表

一、题目:

描述

假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。

给定两个这种链表,请生成代表两个整数相加值的结果链表。

例如:链表 1 为 9->3->7,链表 2 为 6->3,最后生成新的结果链表为 1->0->0->0。

二、输入输出示例:


三、思路:

 将两个链表反转,然后对齐,再逐项相加,注意进位问题。

四、代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
//反转链表的函数代码:设计三个指针进行链表反转
ListNode* reverse(ListNode* head){
    if(head == NULL){
        return head;
    }
    ListNode *p1,*p2,*p3;
    p1 = NULL;
    p2 = head;
    p3 = head->next;
    while(p3 != NULL){
        p2->next = p1;
        p1 = p2;
        p2 = p3;
        p3 = p3->next;
    }
    p2->next = p1;
    return p2;
}
class Solution {
public:
    /**
     * 
     * @param head1 ListNode类 
     * @param head2 ListNode类 
     * @return ListNode类
     */
    ListNode* addInList(ListNode* head1, ListNode* head2) {
        // write code here
        ListNode *result = new ListNode(0);           //为result开辟一个空节点
        ListNode *temp1 = result;    
        if(head1 == NULL){                            //表1为空,则直接输出表2
            return head2;
        }
        if(head2 == NULL){                            //表2为空,则直接输出表1
            return head1;
        }
        head1 = reverse(head1);
        head2 = reverse(head2);
        int res = 0;                                  //定义1个res记录加和
        while(head1 != NULL || head2 != NULL){        //表1表2至少有一个不空
            if(head1 == NULL && head2 != NULL){       //表1空,表2不空,则加表2中的项
                res += head2->val;
                head2 = head2->next;
            }
            else if(head1 != NULL && head2 == NULL){  //表2空,表1不空,则加表1中的项
                res += head1->val;
                head1 = head1->next;
            }
            else{                                     //表1表2都不空,则加表1和表2的项
                res += head1->val + head2->val;
                head1 = head1->next;
                head2 = head2->next;
            }
            if(res >= 10){                            //加和>=10,需要进位,将res置1
                temp1->val = res%10;
                res = 1;
            }
            else{                                     //加和<10,不需进位,将res置0
                temp1->val = res;
                res = 0;
            }
            temp1->next = new ListNode(0);            //给结点赋值后,在开辟新的空节点
            temp1 = temp1->next;                      //结点后移一位
        }
        if(res == 1){                                 //如果最后一次加和需要进位,则将最后一个结点的值置1
            temp1->val = 1;
        }
        ListNode *res1 = reverse(result);             //反转结果链表
        if(res1 -> val == 0)                          //如果最后不需要进1,则结果链表最后多了一个值为0的空节点,
                                                      //反转结果链表之后,这个0就放到了第一位,不可以输出
        {
            res1 = res1->next;
        }
        return res1;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值