題目來自於: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.