您的位置:首页 > 其它

链表求和

2017-03-31 13:58 211 查看
问题描述:你有两个用链表代表的整数,其中每个节点包含一个数字。数字存储按照在原来整数中
相反
的顺序,使得第一个数字位于链表的开头。写出一个函数将两个整数相加,用链表形式返回和。

样例:给出两个链表 3->1->5->null 和 5->9->2->null,返回 8->0->8->null

实现思路:由题意整数在链表中的存储是原来整数中相反的顺序,所以考虑申请一个新链表,让原来两个链表对应位置相加,除10取余作为新链表的当前元素,并且要考虑进位,这是总体的思路。在具体写代码的时候,首先考虑特殊情况,两个链表有空链表的情况,这是就相当于对一个链表进行操作就可以。当两个链表都不空时,就是都从头开始遍历,用一个while循环来实现:

         (1)开始时先初始化一个变量x作为进位的数字,初始化为0;定义整型变量sum等于两个链表对应位置的数字和前一位的进位的和;

             (2)将求得的和sum除10 赋值给x,作为新的要进位的数字;除10取余就是当前位置的元素;

             (3)新链表和两个链表的指针后移。重复执行上述操作。

考虑到两个链表有可能不一样长,那么就是遍历完较短链表时就会跳出while循环了,那么这是我们就要继续考虑剩下的那个链表接着遍历的情况。特别注意的还有如果最后一位还要进位的话,那么还要重新申请一个结点,复制以后链接到新链表最后。

实现代码:

 * 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) {

      ListNode *p1=l1;

      ListNode *p2=l2;

      if(p1==NULL)

      return p2;

      if(p2==NULL)

      return p1;

      ListNode *head=new ListNode(0);

      ListNode *p3=head;

      int x=0;

      while(p1!=NULL&&p2!=NULL)

      {int sum=p1->val+p2->val+x;

       x=sum/10;

       sum=sum%10;

       ListNode *s=new ListNode(sum);

       p3->next=s;

       p3=p3->next;

       p1=p1->next;

       p2=p2->next;

      }

      while(p1!=NULL)

      {int sum=p1->val+x;

       x=sum/10;

       sum=sum%10;

       ListNode *s=new ListNode(sum);

       p3->next=s;

       p3=p3->next;

       p1=p1->next;

      }

      while(p2!=NULL)

      {int sum=p2->val+x;

       x=sum/10;

       sum=sum%10;

       ListNode *s=new ListNode(sum);

       p3->next=s;

       p3=p3->next;

       p2=p2->next;

      }

      if(x!=0)

      {ListNode *s=new ListNode(1);

      p3->next=s;

      p3=p3->next;

      }

      return head->next;}

};

做题感想:这个题需要考虑的细节比较多,同时有新链表和原来的两个链表的指针的移动情况需要考虑清楚,还有两个链表不一样长的情况。最后特别要注意最后一位要进位的话,那么还要重新申请一个结点,复制以后链接到新链表最后。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: