两数之和

77 阅读2分钟

题目

image.png

输入输出示例

image.png

解题关键

  1. 头指针和尾指针的定义,头指针表示的是链表的地址(用于返回),尾指针随着结点的增加而移动
  2. 进位的定义 大于10时,要有进位,当前的位置保留的t的值是t%10(要的是余数)
  3. while循环的条件,首先肯定是l1和l2都不为空,还有一个重要的条件是进位t也不为空,就是当l1和l2都为空时,如果产生了进位(t/10),则循环还要继续执行
  4. 创造一个结点,然后让尾指针的next指向这个新创造的结点

伪代码

创建头节点和尾结点
定义进位值,初始化为0
while(循环条件){
如果l1不为空,l1的值加到t上,并指向l1的下一个结点
如果l2不为空,l2的值加到t上,并指向l2的下一个结点
新分配一个结点空间,让尾结点的next指向这个新分配的内存空间
对t取余
让新结点的数据域的值为t取余后的值
新结点的next域置为空
然后再更新尾指针,使尾指针指向这个新的结点 
令t = t/10 得到进位的值,下一次循环后直接进行累加(个人觉得这个很关键)
}
最后返回的是头结点指向的下一个结点的地址

代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
    struct ListNode* head =malloc(sizeof(struct ListNode));
    struct ListNode* tail = head;
    int t  = 0;
    //循环的条件是l1或l2或t非空就执行,如果l1和l2已经为空,但是有一个进位,也要继续执行
    while(l1 || l2 || t){
        if(l1){
            t += l1->val;
            l1 = l1->next;
        }; 
        if(l2){
            t +=l2->val;
            l2 = l2->next;
        }; 
        //新分配一个大小为ListNode的内存,然后让tail->next指向这个内存
        tail->next = malloc(sizeof(struct ListNode));
        // 取余数 因为只能存一个值
        tail->next->val = t%10;
        tail->next->next = NULL;
        //指向一个新结点
        tail = tail->next;
        //取商 得到的是进位,下一次循环时直接累加
        t = t/10;
    };
    return head->next;
}

最后

代码借鉴了力扣题解中的某个大佬