力扣2. 两数相加

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

 

示例 1:

输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.

 

示例 2:

输入:l1 = [0], l2 = [0]
输出:[0]

 

示例 3:

输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]

 

链表版大数相加,出题人已经将链表逆序存储,降低了难度,我们顺序计算即可。虽然使用尾插法,但也要留个头结点做输出。

 

 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     ListNode *next;
 6  *     ListNode() : val(0), next(nullptr) {}
 7  *     ListNode(int x) : val(x), next(nullptr) {}
 8  *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 9  * };
10  */
11 class Solution {
12 public:
13     ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
14         ListNode *p1=l1;
15         ListNode *p2=l2;
16         ListNode *tail=new ListNode(); //,tail是结果链表的尾结点
17         ListNode *head=tail; //结果链表的头结点
18         while(p1!=nullptr){
19             int temp=p1->val;
20             if (p2!=nullptr){
21                 temp+=p2->val;
22             }
23             //检测是否存在进位
24             if (temp>9&&p1->next==nullptr){
25                 p1->next=new ListNode(1);
26             }else if (temp>9&&p1->next!=nullptr){
27                 p1->next->val+=1;
28             }
29             //采用尾插法创建结果链表
30             ListNode *now=new ListNode(temp%10);
31             tail->next=now;
32             tail=now;
33             //更新节点
34             if (p1!=nullptr)
35                 p1=p1->next;
36             if (p2!=nullptr)
37                 p2=p2->next;
38         }
39         if (p2!=nullptr){  //若l2更长,则直接把l2剩下的部分链接到结果链表
40             tail->next=p2;
41         }
42         return head->next;
43     }
44 };

 

posted on 2023-05-23 10:48  Coder何  阅读(19)  评论(0)    收藏  举报