力扣-练习

一、两数相加

1.1 题目

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头

力扣-练习_第1张图片

1.2 解读

 逆序存储:因此,第一位为个位,第二位为十位,依次类推;因此,遍历链表,每一位相加即可,若长度不同,则NULL记为0。

 注意事项: 每一位需要判断是否满10进1,存于carry变量。

                    每一位和为:n1+n2+carry,n1为链表1值,n2为链表2值;

                    最高位,即链表最后一位和,需判断是否进位

解题思路: 

        1.遍历l1、l2链表;

                1.1 每一次遍历,相加相应位置值,sum=n1+n2+carry;

                1.2 输出链表进行尾插操作,val = sum%10;

                1.3 更新carry,carry=sum/10;

        2.判断最高位carry

1.3 代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
    struct ListNode* head=NULL; //定义头指针,用于指向输出链表
    struct ListNode* cur=NULL; //游标指针,在输出链表中移动,进行尾插操作
    int carry = 0; //初始化进位标志
    cur = head; //初始状态下,游标位于链表头
    while(l1 || l2) 
    {
       int n1 = l1? l1->val : 0; //判断链表1是否还有元素
       int n2 = l2? l2->val :0; // 判断链表2是否还有元素
       int sum = n1 + n2 +carry; //当前位取和
       if(!head)  //头为空的时候
       {
           head = cur = malloc(sizeof(struct ListNode)); //头指针,游标指针在同一位置
           cur->val = sum%10;
           cur->next = NULL;
       }
       else
       {
           cur->next = malloc(sizeof(struct ListNode)); //给下一个链表元素申请空间
           cur->next->val = sum%10; //给下一个链表元素赋值
           cur = cur->next; //游标移位
           cur->next = NULL;
       }
       carry = sum/10;  //进位值为和/10,保留整数部分
       if(l1) //当l1为非空时
       {
           l1 = l1->next; //l1链表向后移动一位
       }
       if(l2)
       {
           l2 = l2->next;
       }
    }
    if(carry)  //最高位和大于10,即进位标志位仍存在数
    {
        cur->next = malloc(sizeof(struct ListNode)); //给下一个链表元素申请空间
        cur->next->val = carry; //给下一个链表元素赋值
        cur = cur->next; //游标移位
        cur->next = NULL;
    }
    return head;
}

你可能感兴趣的:(C语言,leetcode,链表,算法)