问题描述:
你有两个用链表代表的整数,其中每一个节点包含一个数字,数字存储按照在原来整数中相反的顺序,使得第一个数字位于链表的开头。写出一个函数将两个整数相加,用链表形式返回和。
实现思路:
当两个链表均不为空时,对应的元素相加,保留进位。当其中有一个链表为空时,将近位加进另一个链表。如果加到最后一位还有进位,就创建一个新的节点,该节点的值等于该进位,该节点的next等于NULL。
代码:
/**
* 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
ListNode *head=new ListNode;
ListNode *r=head;
ListNode *s;
int c=0;
while(l1!=NULL&&l2!=NULL) {
s=new ListNode;
s->next=NULL;
s->val=(l1->val+l2->val+c);
c=(l1->val+l2->val+c)/10;
r->next=s;
l1=l1->next;
l2=l2->next;
r=s;
}
while(l2!=NULL) {
s=new ListNode;
s->next=NULL;
s->val=(l2->val+c);
c=(l2->val+c)/10;
r->next=s;
l2=l2->next;
r=s;
}
while(l1!=NULL) {
s=new ListNode;
s->next=NULL;
s->val=(l1->val+c);
c=(l1->val+c)/10;
r->next=s;
l1=l1->next;
r=s;
}
if(c) {
s=new ListNode;
s->val=c;
s->next=NULL;
r->next=s;
}
return head->next;
}
};
感想:
链表相加要考虑进位,还要考虑当其中一个链表为空时的情况。还要考虑加到最后一个节点时,有没有进位。