题意如下:
You are given two non-empty linked lists representing two non-negative integers. 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.
You may assume the two numbers do not contain any leading zero, except the number 0 itself.
链表结构为:
struct ListNode
{
int val;
ListNode * next;
ListNode(int x):val(x),next(NULL) {}
};
简单而言就是给了两个自定义的单链表,按照十进制运算法则对应位相加
思路1
直接思路:while循环,对两个列表对应位相加,每次判断生成的数是否比10大,然后使得结果链表对应增长。然后两个while循环一直到l1和l2都为NULL,最后的进位等–TLE
思路2
还是基本思路,只用一个while循环:给定的两个列表不全为NULL;
用x,y分别记录当前位置的l1和l2的val值,当其中一个为NULL时,对应的x或y为0
up保存进位,一开始为0;sum记录总和,利用sum%10和sum/10来保留每一位置的和 sum%10即需要保留到结果中的值
代码如下:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode * l3=new ListNode(0);//结果列表,0为头部
ListNode * r = l3;//用于增长
ListNode *p = l1,*q = l2;
int x,y,up=0,sum = 0;
while(p!=NULL||q!=NULL)
{
x = (p!=NULL)?p->val:0;
y = (q!=NULL)?q->val:0;
sum = (x+y)+up;
up = sum/10;
r->next = new ListNode(sum%10);
r = r->next;
if(p!=NULL)p = p->next;
if(q!=NULL)q = q->next;
}
if(up>0)r->next = new ListNode(up);
return l3->next;
}
总结
1、对链表的知识遗忘甚多,包括头插法、尾插法,遍历等,对链表的结构和操作很陌生;补充一些基本的链表知识:每次新增一个节点的时候都需要先分配空间;本次中r是用了尾插法来增加链表的;对next的理解,确定条件是p!=NULL还是p->next!=NULL;时刻注意在遇到NULL之后就不能继续向下或进行操作了
2、十进制加法,求和后除法和取模的技巧可以使代码更短,进位值一开始就设定,值为0.保证了统一性,不需要单独考虑第一次相加的情况
3、用x,y记录对应值,并在一方为NULL时使其为0,很巧妙的保证了统一性