Leetcode 2 Add Two Numbers

本文介绍了一种算法问题——两个表示非负整数的链表相加的方法。链表中的数字按逆序存储,每个节点包含一个数字。文章提供了两种解决思路:一种是直接在原链表上进行操作;另一种是创建一个新的链表来存储结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**
* ID: 2
* Name: Add Two Numbers
* Data Structure: Linked List
* Time Complexity:
* Space Complexity:
* Tag: LinkList
* Difficult: Medium

* Problem:
* You are given two linked lists representing two non-negative numbers.
* The digits are stored in reverse order and each of their nodes contain a single digit.
* Add the two numbers and return it as a linked list.
* Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
* Output: 7 -> 0 -> 8

 

思路一: 本题主要注意谁先遍历结束,而且注意进位的问题,carry,就是当没有新的node,但还有carry的时候,就要新加一个node进去。

在两个链表没有都没结束,互加,进位,然后把L2合并到L1 里面去,然后在让L1 走完,完成进位的所有操作.

思路二: 建立一个全新的List,然后每次对L1,L2,carry的值分别加进去,最后返回一个新的List. 

 1 class Solution {
 2 public:
 3     ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) {
 4         if(l1 == NULL)
 5             return l2; 
 6         if(l2 == NULL)
 7             return l1; 
 8 
 9         ListNode *fakeNode1 = new ListNode(0);
10         ListNode *fakeNode2 = new ListNode(0);
11         fakeNode1 -> next = l1; 
12         fakeNode2 -> next = l2; 
13         ListNode *p1 = fakeNode1; 
14         ListNode *p2 = fakeNode2; 
15         int carry = 0;
16         int sum = 0;
17 
18         while(p1->next && p2->next)
19         {
20             p1 = p1->next; 
21             p2 = p2->next;
22             sum = carry + p1->val + p2->val;
23             carry = sum/10;
24             p1->val = sum%10;  
25              
26         }
27         
28         if(p1->next==NULL && p2->next!=NULL)
29         {
30             p1->next = p2->next; 
31         }
32         delete p2;
33         delete fakeNode2; 
34         while(p1->next)
35         {
36             p1 = p1->next; 
37             sum = carry + p1->val ;
38             carry = sum/10;
39             p1->val = sum%10;
40         }
41        if(carry!=0)
42         {
43             ListNode *last = new ListNode(carry);
44             p1->next = last;              
45         }  
46         return fakeNode1->next; 
47     }
48 };

 

思路二: 

 1 class Solution {
 2 public:
 3     ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) {
 4         ListNode *dummy = new ListNode(0), *p = dummy;
 5         int carry = 0;
 6         while(l1 || l2 || carry) {
 7             if(l1) {
 8                 carry+=l1->val;
 9                 l1 = l1->next;
10             }
11             if(l2) {
12                 carry+=l2->val;
13                 l2 = l2->next;
14             }
15             p->next = new ListNode(carry%10); // every time create a new node. 
16             carry /= 10;
17             p = p->next;
18         }
19         return dummy->next;
20     }
21 };

 

转载于:https://www.cnblogs.com/zhuguanyu33/p/4421193.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值