leetcode刷刷题(33) ---- 链表求和(C语言版)

2020-2-15

  • Do not take anyone else’s word about what is right and wrong.
    不要人云亦云。

题目

给定两个用链表表示的整数,每个节点包含一个数位。
这些数位是反向存放的,也就是个位排在链表首部。
编写函数对这两个整数求和,并用链表形式返回结果。

示例:
输入:(7 -> 1 -> 6) + (5 -> 9 -> 2),即617 + 295
输出:2 -> 1 -> 9,即912

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sum-lists-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

个人解答:(C版本)

  • 就是对应为相加,然后将结果保存在动态生成的空间,注意的是进位问题。
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){

    int carryFlag = 0;
    int sum = 0;
    int oneFlag = 1;
    struct ListNode* l = NULL;
    struct ListNode* q = NULL;
    struct ListNode* p = NULL;
    
    while((NULL != l1) || (NULL != l2))
    {
    	// 给要计算结果储存分配空间
        p = (struct ListNode*)malloc(sizeof(struct ListNode));
        
        // 第一次进入
        if(1 == oneFlag)
        {
            l = p;
            q = p;
            oneFlag = 0;
        }
        else
        {
            q->next = p;
            q = q->next;
        }
        
        // 判断三种情况
        if(NULL == l1)
        {
            sum = l2->val + carryFlag;
            l2 = l2->next;
        }
        else if(NULL == l2)
        {
            sum = l1->val + carryFlag;
            l1 = l1->next;
        }
        else
        {
            sum = l1->val + l2->val + carryFlag;
            l1 = l1->next;
            l2 = l2->next;
        }
		
		// 处理进位
        if(sum >= 10)
        {
            carryFlag = 1;
            sum -= 10;
        }
        else
        {
            carryFlag = 0;
        }

        q->val = sum;
    }

    // 如果最后一位还有进位,需要处理
    if(1 == carryFlag)
    {
        q->next = (struct ListNode*)malloc(sizeof(struct ListNode));
        q = q->next; 
        q->val = 1;
        q->next = NULL;
    }
    else
    {
        q->next = NULL;
    }

    return l;
}
  • 结果:
    leetcode刷刷题(33) ---- 链表求和(C语言版)_第1张图片
他山之石:

你可能感兴趣的:(LeetCode刷题笔记)