LeetCode鏈表練習

題目來自於:https://leetcode-cn.com/problems/add-two-numbers

Python

# 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:
        ls = ListNode()
        ls_copy = ls
        carry = 0
        while l1 or l2:
            if not l1:
                sum_bit = l2.val + carry
                l2 = l2.next
            elif not l2:
                sum_bit = l1.val + carry
                l1 = l1.next
            else:
                sum_bit = l2.val + l1.val + carry
                l1 = l1.next
                l2 = l2.next
            
            if sum_bit >= 10:
                ls_copy.next = ListNode(sum_bit-10)
                carry = 1
            else:
                ls_copy.next = ListNode(sum_bit)
                carry = 0
            ls_copy = ls_copy.next
        if carry == 1:
            ls_copy.next = ListNode(1)
        return ls.next

C語言

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
    struct ListNode * ls=(struct ListNode*)malloc(sizeof(struct ListNode));//創建一個頭結點
    struct ListNode * ls_copy=ls;//聲明一個指針指向頭結點,用於遍歷鏈表
    int carry = 0;
    int sum_bit;
    while (l1 || l2){
        if (l1==NULL){
            sum_bit = l2->val + carry;
            l2 = l2->next;
        }else if (l2==NULL){
            sum_bit = l1->val + carry;
            l1 = l1->next;
        }else{
            sum_bit = l1->val + l2->val + carry;
            l1 = l1->next;
            l2 = l2->next;
        }
        
        struct ListNode * c=(struct ListNode*)malloc(sizeof(struct ListNode));
        if (sum_bit >= 10){
            c->val = sum_bit-10;
            carry = 1;
        }else{
            c->val = sum_bit;
            carry = 0;
        }
        c->next = NULL;
        ls_copy->next = c;
        ls_copy = ls_copy->next;
    }
    if (carry == 1){
        struct ListNode * c=(struct ListNode*)malloc(sizeof(struct ListNode));
        c->val = 1;
        c->next = NULL;
        ls_copy->next = c;
    }
    return ls->next;
}

思路

參考於評論區的大佬。

1.首先創建一個空的鏈表,用於存儲計算的結果。

2.如果待計算的l1和l2中有一個未到末尾,則執行計算。

    2.1 如果l1和l2都未到末尾,則直接將當前值相加,若其中一個已到達末尾,則不加其數值。

    2.2 將l1和l2向後移動一位,如果已到末尾則不移動。

    2.3 根據求和值是否大於等於10,酌情進位。

3.存儲求和結果。

4.如果循環結束時進位爲1,則在結果最後再補一位1.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章