[Leetcode] Add two numbers 两数之和

时间:2024-07-04 13:34:56

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

题意:求以链表形式表示的两非负整数之和,高位在后。

思路:联想数组形式的计算,以一个变量carry为对应位置的和,carry%10为当前值,carry/10为进位。在数组里,直接在长度较大的数组更新值就行,但是链表的长度没法直接获得。所以出现了问题一:如何保存数据。所以针对这个问题有两种解法,但求和的思想还是不变。问题二、若是最高位有进位,怎么办?这种情况下,只能新建一个结点,然后赋值。

方法一:开辟一个新的链表,每次都是将对应的值赋给新开辟的结点。这就遇到循环条件的问题,若是l1&&l2则会遇到有其中一个链表遍历完时,剩下的链表的进位情况,若剩下的结点值全是9,即存在进位的可能则可能有需要另一个while循环,所以这里为代码的简洁还是用 l1||l2 。还有一点值得注意的是,对当前结点的取值一定要在当前结点存在的情况下,不然会造成错误。代码如下:

 /**
* 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)
{
if(l1==NULL) return l2;
if(l2==NULL) return l1; int carry=;
ListNode *nList=new ListNode(-);
ListNode *pre=nList; while(l1||l2)
{
if(l1)
{
carry+=l1->val;
l1=l1->next;
}
if(l2)
{
carry+=l2->val;
l2=l2->next;
} pre->next=new ListNode(carry%);
carry/=;
pre=pre->next;
} if(carry==)
pre->next=new ListNode(); return nList->next;
}
};

方法二:参考数组的做法,先找出较长的,然后更新较长链表上结点的值。参考LeetCode上的讨论

 /**
* 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)
{
int flag=;
int sum=;
ListNode *pointer1=l1;
ListNode *pointer2=l2;
ListNode *result=NULL;
while(pointer1&&pointer2)
{
pointer1=pointer1->next;
pointer2=pointer2->next;
}
if(pointer1==NULL)
result=l2;
else
result=l1; ListNode *nList=result; while(l1||l2)
{
sum=(l1?l1->val:)+(l2?l2->val:)+flag;
flag=sum/;
result->val=sum%;
l1?l1=l1->next:l1;
l2?l2=l2->next:l2;
result->next?result=result->next:result; //值得注意必须先判断存在,
} //思考,若存在进位,和下面的代码会产生什么后果
if(flag==)
{
result->next=new ListNode();
} return nList;
}
};