返回
探索LeetCode热门100题目:「两数相加」——携手并进,携手探索
前端
2024-01-05 01:09:08
序幕:算法之美,LeetCode之门
算法是计算机科学的基石,而LeetCode则是算法学习的殿堂。这里汇聚了众多经典算法题目,等待着我们去探索、去征服。LeetCode热门100题目更是精华中的精华,是算法学习的必经之路。
第一幕:两数相加,携手并进
「两数相加」题目是这样的:给你两个非空链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。
听起来很简单,对吧?但是,当我们真正开始动手解决时,却会发现其中蕴含着不少奥秘。
第二幕:链表结构,数据之桥
在解决「两数相加」之前,我们首先要理解链表结构。链表是一种常用的数据结构,它由一系列节点组成,每个节点包含一个数据项和一个指向下一个节点的指针。链表的优势在于,它可以动态地增加或删除节点,而不需要移动其他节点,因此非常适合存储动态变化的数据。
第三幕:相加算法,携手同行
理解了链表结构之后,我们就可以开始设计相加算法了。我们从链表的尾部开始,逐位相加,将进位保留到下一位。如果链表长度不同,则在较短的链表末尾补0。
def addTwoNumbers(l1, l2):
dummy = ListNode(0)
current = dummy
carry = 0
while l1 or l2 or carry:
val1 = l1.val if l1 else 0
val2 = l2.val if l2 else 0
total = val1 + val2 + carry
carry = total // 10
current.next = ListNode(total % 10)
current = current.next
l1 = l1.next if l1 else None
l2 = l2.next if l2 else None
return dummy.next
第四幕:实践出真知,代码磨炼
在理解了相加算法之后,我们就可以开始编写代码了。我们可以使用Python、Java、C++等语言来实现这个算法。
# Python代码示例
def addTwoNumbers(l1, l2):
dummy = ListNode(0)
current = dummy
carry = 0
while l1 or l2 or carry:
val1 = l1.val if l1 else 0
val2 = l2.val if l2 else 0
total = val1 + val2 + carry
carry = total // 10
current.next = ListNode(total % 10)
current = current.next
l1 = l1.next if l1 else None
l2 = l2.next if l2 else None
return dummy.next
# Java代码示例
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode dummy = new ListNode(0);
ListNode current = dummy;
int carry = 0;
while (l1 != null || l2 != null || carry != 0) {
int val1 = l1 != null ? l1.val : 0;
int val2 = l2 != null ? l2.val : 0;
int sum = val1 + val2 + carry;
carry = sum / 10;
ListNode node = new ListNode(sum % 10);
current.next = node;
current = current.next;
l1 = l1 != null ? l1.next : null;
l2 = l2 != null ? l2.next : null;
}
return dummy.next;
}
# C++代码示例
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* dummy = new ListNode(0);
ListNode* current = dummy;
int carry = 0;
while (l1 || l2 || carry) {
int val1 = l1 ? l1->val : 0;
int val2 = l2 ? l2->val : 0;
int sum = val1 + val2 + carry;
carry = sum / 10;
ListNode* node = new ListNode(sum % 10);
current->next = node;
current = current->next;
l1 = l1 ? l1->next : nullptr;
l2 = l2 ? l2->next : nullptr;
}
return dummy->next;
}
尾声:算法之旅,永无止境
「两数相加」只是一个开始,LeetCode热门100题目还有更多精彩等待着我们去探索。让我们携手并进,携手探索,在算法的海洋中乘风破浪,不断提升自己的编程技巧和算法能力。