链表求和

来源:互联网 发布:高音 知乎 编辑:程序博客网 时间:2024/06/05 18:36

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

样例:给出两个链表 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;}
};

做题感想:这个题需要考虑的细节比较多,同时有新链表和原来的两个链表的指针的移动情况需要考虑清楚,还有两个链表不一样长的情况。最后特别要注意最后一位要进位的话,那么还要重新申请一个结点,复制以后链接到新链表最后。

0 0
原创粉丝点击