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
由于本人英语不行,所以读题读了好一会儿才搞明白意思(好吧,其实我是看样例看懂的-=-)。本题意思是给你两个链表,然后按位相加,注意加出来如果大于10需要进行求余以及对下一位进行进位。那么感觉上还是比较简单的,遍历两个链表,存储是否进位的一个标记,代码如下
<span style="font-size:14px;">/**
* 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* p;
ListNode* q;
ListNode* r;
int f=0;
q=l1;
r=l2;
for(;;)
{
if(l1->next==NULL&&l2->next==NULL) break;
if(l1->next==NULL)
{
p=new ListNode(0);
l1->next=p;
}
if(l2->next==NULL)
{
p=new ListNode(0);
l2->next=p;
}
l1=l1->next;
l2=l2->next;
}
l1=q;
l2=r;
p=new ListNode((l1->val+l2->val)%10);
f=(l1->val+l2->val)/10;
q=p;
l1=l1->next;
l2=l2->next;
for(;;)
{
if(l1==NULL&&f==0) break;
if(l1!=NULL)
{
r=new ListNode((l1->val+l2->val+f)%10);
f=(l1->val+l2->val+f)/10;
}
else
{
r=new ListNode(f);
f=0;
q->next=r;
q=r;
break;
}
q->next=r;
q=r;
l1=l1->next;
l2=l2->next;
}
return p;
}
};</span>
需要注意的是此处两个链表并非说一定是等长链表,所以需要进行中间那部分将两个链表进行等长的处理,故获得了一次RE,另外代码少粘一部分一次WA,第三次AC。
时间为36ms在C++中,属于较为不错的时间效率: