题目
You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
分析
题目给出两个单链表表示两个非负数,每个节点只能装一个数字(0-9)并且这些数字倒序排放,即是说,比如一个数为871,链表的存储就是1->7->8。现在让你把这两个数加起来,并且同样用链表的方式存储。
有以下的几个情况需要考虑:
1.L1、L2有一个或两个为空,直接返回;
2.L1, L2长度不一样,要注意长出来的部分;
3.注意进位,最高位有可能有进位,需要多分配一个节点存储这个进位。
知识点
1.单链表的遍历;
2.单链表的建立和初始化。
代码
/**
* 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 *p1 = l1, *p2 = l2; // p1, p2分别指向l1, l2
ListNode *pNode = NULL, *pNext = NULL, *start = NULL; //pNode为新分配的节点,pNext用来遍历链表,start指向链表的开头
int jinWei = 0; // 两个节点的值加起来若大于10, 则进位为1
if( l1 == NULL ) return l2;
if( l2 == NULL ) return l1;
while(p1!=NULL && p2!=NULL){ //当两个链表里都有值
pNode = new ListNode(p1->val + p2->val + jinWei);
jinWei = pNode->val / 10;
pNode->val = pNode->val % 10;
if(start == NULL){
start = pNode;
pNext = pNode;
}
else{
pNext->next = pNode;
pNext = pNext->next;
}
p1 = p1->next;
p2 = p2->next;
}
while(p1 != NULL){ // p1里面还有值
pNode = new ListNode(p1->val + jinWei);
jinWei = pNode->val / 10;
pNode->val = pNode->val % 10;
pNext->next = pNode;
pNext = pNext->next;
p1 = p1->next;
}
while(p2 != NULL){ // p2里面还有值
pNode = new ListNode(p2->val + jinWei);
jinWei = pNode->val / 10;
pNode->val = pNode->val % 10;
pNext->next = pNode;
pNext = pNext->next;
p2 = p2->next;
}
if( jinWei > 0 ){
pNode = new ListNode(jinWei);
pNext->next = pNode;
}
return start;
}
};