您的位置:首页 > 其它

链表求和

2017-03-26 13:23 197 查看
1、问题描述

      你有两个用链表代表的整数,其中每个节点包含一个数字。数字存储按照在原来整数中相反的顺序,使得第一个数字位于链表的开头。写出一个函数将两个整数相加,用链表形式返回和。给出两个链表 3->1->5->null 和 5->9->2->null,返回 8->0->8->null

2、实现思路

     有3种情况,第一:两个链表一样长;第二:两个链表非空但不一样长;第三:有空链表。第三种情况直接返回非空链表。当同一位置两个链表都有值时,加和,在新链表中的相应位置,若和<10,为原值,若值>10时,其除以10的余数为返回值,十位数加到下一位置两链表求和中。当同一位置有一链表结束,直接返回未结束链表。最后元素求和结束时若还有除以10的十位数需重新建立一个结点赋值。

3、代码

/**

 * Definition for singly-linked list.

 * struct ListNode {

 *     int val;

 *     ListNode *next;

 *     ListNode(int x) : val(x), next(NULL) {}

 * };

 */

class Solution {

public:

    /**

     * @param l1: the first list

     * @param l2: the second list

     * @return: the sum list of l1 and l2 

     */

    ListNode *addLists(ListNode *l1, ListNode *l2) {

        // write your code here

        if (l1 == NULL)

        {return l2;}

        if(l2 == NULL)

        { return l1;}

        int c= 0;

        int t= 0;

        ListNode *head = new ListNode(0);

        ListNode *p = head;

        while (l1!=NULL&&l2!= NULL)

        {

            t = l1->val+l2->val + c;

            c = t/10;

            t = t%10;

            p->next = new ListNode(t);

            p = p->next;

            l1 = l1->next;

            l2 = l2->next;

        }

        while (l1 != NULL&&l2==NULL)

        {

            t = l1->val + c;

            c = t/10;

            t = t%10;

            p->next = new ListNode(t);

            p = p->next;

            l1 = l1->next;

        }

        while (l2 != NULL&&l1==NULL)

        {

            t = l2->val + c;

            c = t/10;

            t = t%10;

            p->next = new ListNode(t);

            p = p->next;

            l2 = l2->next;

        }

        if (c != 0)

        {

            p->next = new ListNode(c);

        }

        return head->next;

    }

};

4、感想

      本题需要考虑多各方面,首先是链表长度的问题,其次是加和时若<>=10时的不同处理,并且链表最后一位加和后,若还有进位,需再建立一个结点。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: