链表两数相加的问题与数组里面大数相加的问题一样。
思路:我们从头开始遍历两个链表,当两个链表都没有到头时,我们正常将该节点的值进行相加,并且建立新的节点来保存当前位的值,加入到前面结果的结尾,同时保存进位的值;若当前任意一个链表没有到达末尾,我们应该继续运算,在运算时把已经到达末尾的链表对应位看作0(相当于高位用0补齐)。
/**
* 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) {
ListNode* temp=new ListNode(); //建立新的链表用于保存结果
ListNode* ans=temp; //保存新链表的头节点
int s=0; //用于保存进位的值
while(l1!=nullptr||l2!=nullptr||s){ //开始相加,当两个链表都到结尾的时候结束
int sum=(l1?l1->val:0)+(l2?l2->val:0)+s; //如果其中一个链表已经到结尾,那么我们可以认为对应位为0
temp->next=new ListNode(); //建立新节点,保存当前位值
temp=temp->next; //移动指针
temp->val=sum%10; //记录当前位的数值
s=sum/10; //保存进位值
if (l1) l1 = l1->next; //两个链表指针后移
if (l2) l2 = l2->next;
}
return ans->next; //返回头节点的下一位
}
};
标签:链表,ListNode,val,相加,next,力扣,l2,l1,两数
From: https://blog.csdn.net/m0_72174153/article/details/144247571