算法设计与分析(1)
题目:Add Two Numbers
https://leetcode.com/problems/add-two-numbers/?tab=Description
解题思想:本题主要是把两个链表数据中的整数合成一个链表,用来模仿十进制的数字相加的结果。这里主要是从每个链表的头部开始把每个结点的数值相加得到一个新的数值,如果数值大于10,就进一位给下个结点,用carry来判断是否有进位加一。由于两个链表的长度可能不一致,所以需要分为多种情况进行判断
代码块
代码块语法遵循标准markdown代码,例如:
#include<iostream>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode *p1, *p2, *p3;
bool carry = 0;
if ((l1->val + l2->val) >= 10) carry = 1;
p3 = new ListNode((l1->val + l2->val)%10);
p1 = p3;
while (l1->next != NULL || l2->next != NULL || carry == 1)
{
if (l1->next != NULL && l2->next != NULL)
{
l1 = l1->next;
l2 = l2->next;
if (carry == 1) {
p2 = new ListNode((l1->val + l2->val +1) % 10);
if (l1->val + l2->val + 1 < 10) carry = 0;
}
else {
p2 = new ListNode((l1->val + l2->val) % 10);
if (l1->val + l2->val >= 10) carry = 1;
}
}
else if (l1->next == NULL && l2->next != NULL)
{
l2 = l2->next;
if (carry == 1) {
p2 = new ListNode(( l2->val + 1) % 10);
if (l2->val + 1 < 10) carry = 0;
}
else {
p2 = new ListNode(l2->val);
carry = 0;
}
}
else if (l1->next != NULL && l2->next == NULL)
{
l1 = l1->next;
if (carry == 1) {
p2 = new ListNode((l1->val + 1) % 10);
if (l1->val + 1 < 10) carry = 0;
}
else {
p2 = new ListNode(l1->val);
carry = 0;
}
}
else
{
p2 = new ListNode(1);
carry = 0;
}
p1->next = p2;
p1 = p2;
}
return(p3);
}
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
}
};
int main() //test
{
ListNode a1(9), a2(2), b1(3), b2(7);
a1.next = &a2;
b1.next = &b2;
ListNode *l1 = &a1, *l2 = &b1, *l3;
l3 = addTwoNumbers(l1, l2);
cout << l3->val;
while(l3->next != NULL)
{
l3 = l3->next;
cout << l3->val;
}
system("pause");
return(0);
}