leetcode算法题练习--两数相加(C语言)

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语言基础语法上。这个月一定要多刷题,巩固基础知识。

发布了6 篇原创文章 · 获赞 0 · 访问量 140

猜你喜欢

转载自blog.csdn.net/weixin_38072112/article/details/103937023
今日推荐