leetcode 2nd problem add two numbers

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/duringsummer/article/details/79954149

1.读题
a.倒序的两个链表,均不为空。
b.数据格式除了0以外开头不能为0。

2.思路
和数据结构选择的大作业类似,大整数加减,不过逆序无需构造循环链表。

3.反思
解题步骤清楚,但是变量的放置位置很有讲究,本来想对个位数做统一处理,发现逻辑上就有问题,因为,涉及到:
a.个位数加个位数,可能不进位的情况。
b.统一的流程只能是有一者或者两者指针移动的循环控制流,两者唯一确定的是都有个位,头结点必须保留作为返回值。

4.注意点和异常处理
a.指针移动要统一。
b.位数不对齐,时刻要考虑,一个链表为空,一个不为空的情况。
c.最后对进位统一处理。

5.代码

/**
 * 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 *sum=new ListNode((l1->val+l2->val)%10);
    int carry = (l1->val+l2->val)/10;
    ListNode* cur = sum;
    ListNode* pn1 = l1->next;
    ListNode* pn2 = l2->next;
        while(pn1!=NULL||pn2!=NULL)
        {


            while(pn1!=NULL&&pn2!=NULL)
            {
                ListNode *point = new ListNode((pn1->val+pn2->val+carry)%10);
                carry = (pn1->val+pn2->val+carry)/10;
                cur->next = point;
                cur = cur->next;
                pn1 = pn1->next;
                pn2 = pn2->next;
            }
            if(pn1!=NULL)
            {
                ListNode *point = new ListNode((pn1->val+carry)%10);
                carry = (pn1->val+carry)/10;
                cur->next = point;
                cur = cur->next;
                pn1 = pn1->next;
            }
            if(pn2!=NULL)
            {
                ListNode *point = new ListNode((pn2->val+carry)%10);
                carry = (pn2->val+carry)/10;
                cur->next = point;
                cur = cur->next;
                pn2 = pn2->next;  
            }


        }

    if(carry!=0)
    {
        ListNode *point = new ListNode(1);
        cur->next = point;
        cur = cur->next;  
    }
    return sum;

    }
};

Add Two Numbers的问题

08-02

求助,LeetCode OJ 上的第二题Add Two Numbers,不熟练链表的我卡在这儿了,两个被加数位数相同算法没问题,位数不相同执行就当了。。。。一直没看出什么问题,调试器只有gdb,不会用。求大神帮忙看看是什么问题,跪谢。rnrn/*Add two numbersrn You are given two linked lists representing two non-negative numbers. rn The digits are stored in reverse order and each of their nodes contain a single digit. rn Add the two numbers and return it as a linked list.rn rn Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)rn Output: 7 -> 0 -> 8rn*/rnrn//定义简单结点rnstruct ListNode rn int val;rn ListNode *next;rn ListNode(int x) : val(x), next(NULL) rn;rnrn//创建解决方案rnclass Solution rnpublic:rn ListNode* addTwoNumbers( ListNode* l1, ListNode* l2 ) rn ListNode *pHead , *pCurr; //定义头指针 , 当前指针rn int sum , val1 , val2 , carry; //定义和,被加数1,被加数2,进位数rn pHead = ( ListNode * )malloc( sizeof( ListNode ) ); //创建第一个结点rn pCurr = pHead; //初始化当前结点rn carry = 0; //初始化进位数rn while( l1 != NULL || l2 != NULL ) //循环直到两个被加数的当前指针都为空rn rn val1 = l1 != NULL ? l1->val : 0; //为被加数赋值rn val2 = l2 != NULL ? l2->val : 0;rn rn sum = ( val1 + val2 + carry ) % 10; //求和rn carry = ( val1 + val2 + carry ) / 10; //求进位rn rn pCurr->val = sum; //为储存结果的链表添加数字rn if ( l1->next != NULL || l2->next != NULL) //储存结果的链表添加下一个结点rn pCurr->next = ( ListNode * )malloc( sizeof( ListNode ) );rn pCurr = pCurr->next;rn rn rn if ( l1 != NULL ) //被加数指针下移rn l1 = l1->next;rn rn if ( l2 != NULL )rn l2 = l2->next;rn rn rn rn if ( carry != 0) //循环结束进位结算rn pCurr->next = ( ListNode * )malloc( sizeof( ListNode ) );rn pCurr = pCurr->next;rn pCurr->val = carry;rn rn rn pCurr->next = NULL;rn rn return pHead; //输出结果rn rn;

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试

关闭