每日一题20201015-链表、指针、结构体

两数相加
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

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

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers

解题
C语言

/**
 * 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, *tail = NULL;
    int carry = 0;
    while (l1 || l2) {
    
    
        int n1 = l1 ? l1->val : 0;
        int n2 = l2 ? l2->val : 0;
        int sum = n1 + n2 + carry;
        if (!head) {
    
    
            head = tail = malloc(sizeof(struct ListNode));
            tail->val = sum % 10;
            tail->next = NULL;
        } else {
    
    
            tail->next = malloc(sizeof(struct ListNode));
            tail->next->val = sum % 10;
            tail = tail->next;
            tail->next = NULL;
        }
        carry = sum / 10;
        if (l1) {
    
    
            l1 = l1->next;
        }
        if (l2) {
    
    
            l2 = l2->next;
        }
    }
    if (carry > 0) {
    
    
        tail->next = malloc(sizeof(struct ListNode));
        tail->next->val = carry;
        tail->next->next = NULL;
    }
    return head;
}

C++

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
    
    
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
    
    
        ListNode *head = nullptr, *tail = nullptr;
        int carry = 0;
        while (l1 || l2) {
    
    
            int n1 = l1 ? l1->val: 0;
            int n2 = l2 ? l2->val: 0;
            int sum = n1 + n2 + carry;
            if (!head) {
    
    
                head = tail = new ListNode(sum % 10);
            } else {
    
    
                tail->next = new ListNode(sum % 10);
                tail = tail->next;
            }
            carry = sum / 10;
            if (l1) {
    
    
                l1 = l1->next;
            }
            if (l2) {
    
    
                l2 = l2->next;
            }
        }
        if (carry > 0) {
    
    
            tail->next = new ListNode(carry);
        }
        return head;
    }
};
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
        jw = 0
        result = []
        while l1 or l2:
            num1 = 0 if l1 == None else l1.val
            num2 = 0 if l2 == None else l2.val
            sum_num = num1 + num2 + jw
            jw = 0
            if sum_num >= 10:
                sum_num = sum_num - 10
                jw = 1
            result.append(sum_num)
            if l1 != None:
                l1 = l1.next
            if l2 != None:
                l2 = l2.next
        # 如果存在进位
        if jw!=0:
            result.append(jw)
        result_node = ListNode(result[-1])
        for i in range(len(result)-2, -1, -1):
            result_node = ListNode(result[i], result_node)
        return result_node

猜你喜欢

转载自blog.csdn.net/qq_35358125/article/details/109103006