您的位置:首页 > 编程语言 > C语言/C++

LeetCode-2-Add Two Nuns(C语言实现)

2017-12-18 03:33 246 查看
/**

 * Definition for singly-linked list.

 * struct ListNode {

 *     int val;

 *     struct ListNode *next;

 * };

 */

struct ListNode* addTwoNumbers(struct
ListNode* l1, struct
ListNode* l2) {

    int add = 0;                       
//记录进位

    struct ListNode *p, *q;            
//设置l1和l2的游标指针

    p = l1;

    q = l2;

    struct ListNode *get, *s, *t;      
//设置返回链表的头指针和拼接借口的记录指针

    

    //读取第一位(本题给出链表不附带空的head头节点)

    s = (struct ListNode *)malloc(sizeof(struct
ListNode));

    s -> next = NULL;

    get = s;

    s -> val = p ->
val + q -> val;

    if(s -> val >
9)                   
//记录和处理第一位的进位

    {

        s -> val %=
10;

        add = 1;

    }

    //读取剩余的l1、l2

    while(p -> next !=
NULL && q -> next !=
NULL)

    {

        p = p -> next;                 
//处理输入链表的记录指针

        q = q -> next;

        t = (struct
ListNode *)malloc(sizeof(struct
ListNode));

        t -> next =
NULL;

        t -> val = p ->
val + q -> val + add;

        add = 0;                       
//记录和处理第二位的进位

        if(t -> val >
9)

        {

            t -> val %=
10;

            add = 1;

        }

        s -> next = t;                 
//处理返回链表的记录指针

        s = s -> next;

    }

    //处理最后一个进位

    //当l1没有读完,l2已经读完时

    if(p -> next !=
NULL && q -> next ==
NULL)

        while(p ->
next != NULL)

        {

            p = p -> next;                 
//处理输入链表的记录指针

            t = (struct
ListNode *)malloc(sizeof(struct
ListNode));

            t -> next =
NULL;

            t -> val = p ->
val + add;

            add = 0;                       
//记录和处理第二位的进位

            if(t ->
val > 9)

            {

                t -> val %=
10;

                add = 1;

            }

            s -> next = t;                 
//处理返回链表的记录指针

            s = s -> next;

        }

    //当l2没有读完,l1已经读完时

    if(p -> next ==
NULL && q -> next !=
NULL)

        while(q ->
next != NULL)

        {

            q = q -> next;                 
//处理输入链表的记录指针

            t = (struct
ListNode *)malloc(sizeof(struct
ListNode));

            t -> next =
NULL;

            t -> val = q ->
val + add;

            add = 0;                       
//记录和处理第二位的进位

            if(t ->
val > 9)

            {

                t -> val %=
10;

                add = 1;

            }

            s -> next = t;                 
//处理返回链表的记录指针

            s = s -> next;

        }

    //当l1和l2都读完时

    if(p -> next ==
NULL && q -> next ==
NULL)

        if(add ==
1)

        {

            t = (struct
ListNode *)malloc(sizeof(struct
ListNode));

            t -> next =
NULL;

            t -> val = add;

            s -> next = t;

        }

    return get;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: