给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
首先看到这道题,两个数相加,这两个数必定都在0~9的范围内,那么我们应该想到两个数相加有以下几种情况:
1.两个相加之后的和依然在0~9的范围内。
2.两个数相加之后超过9需要进位。
其次我们得讨论这两个数,位数一定是相等的吗?显然题目中并没有声明,所以依然有以下几种情况:
1.两个数的位数相等,并且和不会溢出,例如:2->3->6+2->2->1
2.两个数的位数相等,和会溢出,例如:例如:2->3->6+2->2->4
3.两个数位数并不相等,和也不溢出,例如:0->9+9
4.两个数位数不相等,但和溢出,例如:9->9+1
当然你也可以按其他的方式分类,便于写代码就ok!
这样以来,我们就可以拿两个指针遍历这两个链表,同时定义一个进位量(只能是0或1),用两个变量表示这两个链表的val值,然后它们的和就是这两个变量的和再加上进位量的结果,当然,最后一步应再讨论一次进位量,解决溢出。如果两个链表位数不一样的话我们让小的空位数上为0,代码如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* CreateNode(int data)
{
struct ListNode* node = (struct ListNode *)malloc(sizeof(struct ListNode));
node->val = data;
node->next = NULL;
return node;
}
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
struct ListNode* p = l1;
struct ListNode* q = l2;
int carry = 0;//表示进位
int x = 0;
int y = 0;
int sum = 0;
struct ListNode* m = NULL;
struct ListNode* n = m;
while (p != NULL || q != NULL)
{
if(p!=NULL)
{x = p->val;}
else{=0;}
if(q!=NULL)
{ y = q->val;}
else{ y=0;}
sum = x + y + carry;
carry = sum / 10;
if (sum >= 10)
{sum = sum % 10;}
struct ListNode* node=CreateNode(sum);
if (n == NULL)
{n = node;
m = n;
}
else {
while (n->next != NULL)
{
n = n->next;
}
n->next = node;
n=n->next;
}
if(p!=NULL)
{p= p->next;}
if(q!=NULL)
{q = q->next;}
}
if (carry == 1)
{
n->next = CreateNode(1);
}
return m;
}
在这里有必要说明一下,上面是我自己做题的时候的代码,看着很长,而且感觉自己做的时候有些多余,有时候简化代码还是有必要的,大家不要像我学习,我会改的,尤其是看了大神的代码之后,感觉自己写的真的上不了台面,下面附LeetCode上的大神代码,是用java写的:
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode dummyHead = new ListNode(0);
ListNode p = l1, q = l2, curr = dummyHead;
int carry = 0;
while (p != null || q != null) {
int x = (p != null) ? p.val : 0;
int y = (q != null) ? q.val : 0;
int sum = carry + x + y;
carry = sum / 10;
curr.next = new ListNode(sum % 10);
curr = curr.next;
if (p != null) p = p.next;
if (q != null) q = q.next;
}
if (carry > 0) {
curr.next = new ListNode(carry);
}
return dummyHead.next;
}