leetcode算法练习–两数相加
近期要准备复试,所以重新开始学习c语言,就单这道题我就回忆起了不少的知识点。于是想记录下来,便于回顾。
之后若重复刷题,将会把更好的解法给补上去。
1问题如下
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.
Example:
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
Explanation: 342 + 465 = 807.来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/add-two-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2算法思想
本题直接定义两个指针p,q分别指向两个链表l1,l2,之后对p,q同时向后遍历,每遍历一次就将p->val和q->val相加,若结果大于10,则需进位。进位我们用一个整型变量carry表示。相加的结果保存在一个新的链表中。
本题还需考虑三种特殊情况:
测试用例 | 说明 |
---|---|
l1=[0,1],l2=[0,1,2] | 当一个列表比另一个列表长时 |
l1=[],l2=[0,1] | 当一个列表为空时,即出现空列表 |
l1=[9,9],l2=[1] | 求和运算最后可能出现额外的进位,这一点很容易被遗忘 |
代码如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
struct ListNode*head = (struct ListNode*)malloc(sizeof(struct ListNode)); //定义一个带有头结点的结构体指针变量,为其开辟空间。
head->next = NULL; //这一句必不可少,否则将会出现错误。
int carry =0,sum,t1,t2; //carry初始化为0表示无进位。
struct ListNode *p=l1,*q=l2,*l0=head;
while(p!=NULL || q!=NULL){
struct ListNode*p1 = (struct ListNode*)malloc(sizeof(struct ListNode));
p1->next = NULL;
if(p==NULL) //这里的意思是若p为null,而q不为null时,直接将其值设为0,对sum的值就不会有影响。
t1=0;
else{
t1=p->val;
p = p->next;
}
if(q==NULL)
t2=0;
else{
t2=q->val;
q = q->next;
}
sum=t1 + t2 + carry;
l0 ->next = p1; // 将新开辟的p1插入到l0的后面。
p1->val = sum % 10;
if(sum>=10)
carry=1; //如果大于10就要进位。
else
carry=0;
l0 = l0->next;
}
//下面这个判断语句不可缺少,假设l1:[5] l2 :[5]
//那么5+5=10要进位,而此时若少这一句,则答案会只有0。因为已经跳出了上面的while循环。
if(carry==1){
struct ListNode*p1 = (struct ListNode*)malloc(sizeof(struct ListNode));
p1->next = NULL;
l0->next = p1;
p1->val = 1;
}
return head->next;
}
3时间复杂度和空间复杂度
4总结
虽然结果不是很理想,但是能通过还是不错的。
感觉这次花的时间不是在算法上,而是在c语言基础语法上。这个月一定要多刷题,巩固基础知识。