Bootstrap

给你两个 非空 的链表,表示两个非负的整数。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

解题思路:

根据单项链表特性将两个链表循环提取出数据进行相加

这是对数字进位处理,解决方法有点粗暴;(有新的解法可以评论分享)

 处理完后就是链表的创建了:

 最后一步就是确定循环的结束标志:

 最后的最后就是排除结束进位的情况:

 这是最后整体的过程代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
    int u = 0,m = 0,k = 0,l=0;
    int p_flag = 0,q_flag = 0;
    int flag = 1;
    struct ListNode *p = l1,*q = l2,*head_new = NULL,*head_cpy = NULL;
    while(flag)
    {
        k = (u + l)/10;
        l = 0;
        if (p_flag == 0 && q_flag == 0)
            u = p->val + q->val;
        else if(p_flag == 1 && q_flag == 0)
            u = q->val;
        else if(p_flag == 0 && q_flag == 1)
            u = p->val;
        m = (u + k)%10;
        l = (u + k)/10;
        k = 0;
        struct ListNode *p_new = (struct ListNode *)malloc(sizeof(struct ListNode));
        p_new->val = m;
        if(head_new == NULL)
        {
            head_new = p_new;
            head_cpy = p_new;
            p_new->next = NULL;
        }else
        {
            head_new->next = p_new;
            p_new->next = NULL;
            head_new = head_new->next;
        }
        
        if(p->next == NULL && q->next == NULL )
            flag = 0;
        if(p->next != NULL )
            p = p->next;
        else
            p_flag = 1;
        if(q->next != NULL)
            q = q->next;
        else
            q_flag = 1;
    }
    if(l != 0 )
    {
        struct ListNode *p_new = (struct ListNode *)malloc(sizeof(struct ListNode));
        p_new->val = l;
        head_new->next = p_new;
        p_new->next = NULL;
        head_new = head_new->next;
    }
    return head_cpy;
}

;