Add Two Numbers
Total Accepted: 103820 Total Submissions: 487934 Difficulty: Medium
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
/**
* 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 *ListSum = NULL, *pNode = NULL, *tail = NULL;
ListNode *pl1 = l1, *pl2 = l2;
int sum, cnt = 0;
while(pl1 != NULL || pl2 != NULL){
if(pl1 == NULL) { //此时是因为链表pl2比较长
sum = cnt + pl2->val;
}
else if(pl2 == NULL){ //此时是因为链表pl1比较长
sum = cnt + pl1->val;
}
else if(pl1 != NULL && pl2 != NULL){
sum = cnt + pl1->val + pl2->val;
}
cnt = 0;
if(sum >= 10){
cnt = 1;
sum -= 10;
}
pNode = new struct ListNode(sum);
if(ListSum == NULL){
ListSum = pNode;
tail = pNode;
}
else{
tail->next = pNode;
tail = pNode;
}
if(pl1 != NULL)pl1 = pl1->next;
if(pl2 != NULL)pl2 = pl2->next;
}
if(cnt == 1){ //考虑到最高位的两位进位
sum = cnt;
pNode = new struct ListNode(sum);
if(ListSum == NULL){
ListSum = pNode;
tail = pNode;
}
else{
tail->next = pNode;
tail = pNode;
}
}
return ListSum;
}
};
如果将结果存放在其中一个比较长的链表上面,效率应该会更高一些;
写了一半,懒得写了,大概思路就是:首先获得两个链表的长度,通过比较两个链表的长度,来分情况;
如果最高位还是有进位的话,就动态分配一个结点来保存进位1;
改天有时间再试试;