该题不难,但是短时间内写出bug-free的代码也不容易。
要注意几点:
1) 如果l1和l2长短不同,比如说1->3->4和2->5,那么有一个结束了另一个还要单独继续。这里不需要把单个进行的情况单独写出,可以和两个链表并行处理的情况合并起来,注意代码:
int x = p1?p1->val:0;
int y = p2?p2->val:0;
和
if (p1) p1 = p1->next;
if (p2) p2 = p2->next;
2) 特别要注意两个链表都处理完了,但还有一个carry的情况,比如说5+5。
3) addTwoNumbers()里面返回的是head->next。
4) main()函数中如果要对这些节点析构的话,需要用一个loop,把对应的节点挨个delete。注意addTwoNumbers()里面的pHead 严格说也要delete。
#include <iostream>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* p1 = l1;
ListNode* p2 = l2;
ListNode* p = new ListNode(0);
ListNode* pHead = p;
int result = 0;
int carry=0;
while (p1 || p2) {
ListNode* temp = new ListNode(0);
p->next = temp;
p=p->next;
int x = p1?p1->val:0;
int y = p2?p2->val:0;
result = x + y + carry;
if (result>=10) {
result -= 10;
carry = 1;
}else {
carry = 0;
}
p->val=result;
if (p1) p1 = p1->next;
if (p2) p2 = p2->next;
}
if (carry){
ListNode *temp = new ListNode(0);
p->next = temp;
p = p->next;
p->val = 1;
}
return pHead->next;
}
int main()
{
ListNode* p1 = new ListNode(1);
ListNode* l1=p1;
// p1->next = new ListNode(4);
// p1 = p1->next;
// p1->next = new ListNode(3);
ListNode* p2 = new ListNode(8);
ListNode* l2=p2;
//p2->next = new ListNode(6);
// p2 = p2->next;
// p2->next = new ListNode(4);
ListNode *p3 = addTwoNumbers(l1, l2);
while(p3->next) {
cout<<p3->val<<" -> ";
p3 = p3->next;
}
cout<<p3->val;
//对p1,p2,p3的delete要如下进行
// while(p1) {
// ListNode*temp = p1->next;
// delete p1;
// p1=temp;
// }
return 0;
}