题目描述:
思路:对于链表问题,根据以往的经验一般我们都会新建一个dummy node,原因是如果在原链表上进行操作,dummy连上原链表的头结点,这样的话就算头结点变动了,我们可以通过dummy->next获得新链表的头结点。如果需要返回一个新链表,根据该哑结点,我们只需在求出新链表的值后逐个新建结点,然后连在一起即可。本题属于第二种情况。
/**
* 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 *dummyHead=new ListNode(0);
//当前指针指向哑结点
ListNode *cur=dummyHead;
//设值进位,初始为0
int carry=0;
//l1,l2只要有一个不为空,进入加法运算
while(l1!=NULL||l2!=NULL){
//获取l1中加数的值
int x=(l1!=NULL)?l1->val:0;
//获取l2中加数的值
int y=(l2!=NULL)?l2->val:0;
//求和
int sum=x+y+carry;
//更新进位的值
carry=sum/10;
//新链表的下一个结点
cur->next=new ListNode(sum%10);
//更新l1指向下一个结点
if(l1!=NULL) l1=l1->next;
//更新l2指向下一个结点
if(l2!=NULL) l2=l2->next;
//更新当前结点
cur=cur->next;
}
//确保最后一位是否进位
if(carry>0){
cur->next=new ListNode(carry);
}
return dummyHead->next;
}
};