本题也是主要考察编码能力,大家加油!
题目描述:
题号:2
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
解题思路:
思路一:两链表数值以及进位的数字相加
新链表的值为 链表 1 的值 + 链表 2 的值 + 进位值 的加和 除以 10,最后如果有进位还有将其追加在新链表的最后面
时间复杂度:O(N + M) N、M为两链表长度
空间复杂度:O(N)
C++
// 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) {
if(l1 == nullptr) {
return l2;
}
if(l2 == nullptr) {
return l1;
}
ListNode *head = nullptr, *cur = nullptr;
int nextNum = 0;
while(l1 != nullptr || l2 != nullptr) {
int num1 = l1 != nullptr ? l1->val : 0;
int num2 = l2 != nullptr ? l2->val : 0;
int sum = num1 + num2 + nextNum;
if(head == nullptr) {
cur = head = new ListNode(sum % 10);
} else {
cur->next = new ListNode(sum % 10);
cur = cur->next;
}
nextNum = sum / 10;
if(l1 != nullptr) {
l1 = l1->next;
}
if(l2 != nullptr) {
l2 = l2->next;
}
}
if(nextNum > 0) {
cur->next = new ListNode(nextNum);
}
return head;
}
};
go
// go
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
if l1 == nil {
return l2
}
if l2 == nil {
return l1
}
var head, cur *ListNode
nextNum := 0
for l1 != nil || l2 != nil {
var num1, num2 int
if l1 != nil {
num1 = l1.Val
l1 = l1.Next
}
if l2 != nil {
num2 = l2.Val
l2 = l2.Next
}
sum := num1 + num2 + nextNum
nextNum = sum/10
if head == nil {
head = &ListNode{Val:sum%10}
cur = head
} else {
cur.Next = &ListNode{Val:sum%10}
cur = cur.Next
}
}
if nextNum > 0 {
cur.Next = &ListNode{Val:nextNum}
}
return head
}