leetcode - [链表] - (2) 两数相加

1、问题描述

使用两个非空的链表来表示两个非负整数,其中链表的每个节点存储着数位上的一个数,且按照逆序存储。
将两数加和,返回一个新的链表来表示这两个数的和。
您可以假设除数字0外,这两个数都不会以0开头。
示例:

输入:(2->4->3+5->6->4)
输出:(7->0->8)
原因:342 + 465 = 807

2、解题思路

  • 边界条件:(1)两条链表皆为空;(2)有一条链表为空;(3)两个n位数相加得到n+1位数,如55 + 60 = 125。(4)两条链表的位数相差很大,如2和1453;
  • 思路分析:先声明一下所使用的数据结构,
  • 三个迭代指针p1、p2,p1表示list1的迭代指针,p2表示list2的的迭代指针,p3表示加和后新链表的迭代指针;
  • 加和后新链表的头节点dummyhead;
  • 进位标志变量carry ,如果carry=true,代表需要进位;
  • 初始化:刚开始令p1指向第一个链表list1的第一个节点,p2指向第二个链表list2的第一个节点;申请dummyhead节点;并令p3指向dummyhead节点
  • 处理逻辑:
  • p1、p2在list1、list2上进行同步迭代,如果p1、p2指向的节点均不为空,则申请一个新的节点new_node,将p1、p2所指向的两个节点之和赋值给new_node的值域,令p3的next指针指向new_node,p3=new_node;
  • 如果p1指向的为空,而p2指向的不为空,则直接将p2及其后面的所有节点复制到p3后面;
  • 如果p1指向的不为空,而p2指向的为空,则直接将p1及其后面的所有节点复制到p3后面。

3、代码实现

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode* p1;
        ListNode* p2;
        ListNode* p3;
        bool carry;
        ListNode dummyhead(0);
        
        p1 = l1;
        p2 = l2;
        p3 = &dummyhead;
        carry = false;

        int value = 0;
        ListNode* new_node = NULL;
        while(p1 != NULL && p2 != NULL){
            value = p1->val + p2->val;
            if (carry == true){
                value += 1;
            }
            carry = (value >= 10) ? true : false ;
            if(value >= 10){
                value -= 10;
            }
            new_node = new ListNode(value);
            p3->next = new_node;
            p3 = new_node;
            
            p1 = p1->next;
            p2 = p2->next;
        }
        while(p1 != NULL){
            value = p1->val;
            if(carry == true){
                value += 1;
            }
            carry = (value >=10 ) ? true : false ;
            if(value >= 10){
                value -= 10;
            }
            new_node = new ListNode(value);
            p3->next = new_node;
            p3 = new_node;

            p1 = p1->next;
            
        }
        while(p2 != NULL){
            value = p2->val;
            if(carry == true){
                value += 1;
            }
            carry = (value >= 10) ? true : false;
            if(value >= 10){
                value -= 10;
            }
            
            new_node = new ListNode(value);
            p3->next = new_node;
            p3 = new_node;

            p2 = p2->next;
            
        }
        if (carry == true){
            new_node = new ListNode(1);
            p3->next = new_node;
        }
        return dummyhead.next;
        
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章