题解 | #链表相加(二)#
链表相加(二)
https://www.nowcoder.com/practice/c56f6c70fb3f4849bc56e33ff2a50b6b
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) : val(x), next(nullptr) {}
* };
*/
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head1 ListNode类
* @param head2 ListNode类
* @return ListNode类
*/
ListNode* addInList(ListNode* head1, ListNode* head2) {
// write code here
if(head1==nullptr){
return head2;
}
if(head2==nullptr){
return head1;
}
//先将链表反转
//创建一个结点为空,一个为头节点
ListNode* pre1=nullptr;
ListNode* cur1=head1;
//当当前节点cur不为空时
while(cur1){
//创建一个临时节点为cur后的位置
ListNode* tem1=cur1->next;
//断开连接将cur指向pre
cur1->next=pre1;
//再将cur和pre都向后移一位
pre1=cur1;//把pre移到cur位置
cur1=tem1;//把cur移到tem位置
}
ListNode* pre2=nullptr;
ListNode* cur2=head2;
while(cur2){
ListNode* tem2=cur2->next;
cur2->next=pre2;
pre2=cur2;
cur2=tem2;
}
//创建一个动态链表
ListNode* list=new ListNode(1);
ListNode* cur=list;
//创建判断是否有进位
bool pd=false;
//遍历当反转后的链表不为空时
while(pre1||pre2){
//定义一个计算和的数
int total=0;
//创建一个节点
ListNode* node;
//如果pre1不为空
if(pre1){
node=pre1;
total+=pre1->val;
pre1=pre1->next;
}
if(pre2){
node=pre2;
total+=pre2->val;
pre2=pre2->next;
}
total=pd?total+1:total;// 如果之前有进位,加1
pd=total>9; // 判断相加结果是否大于9,是否产生新的进位
total=total%10;// 只保留个位数
node->val=total;// 更新节点的值
node->next=list->next; // 将当前节点插入到结果链表的头部(头插法)
list->next=node;
}
//如果最终仍然有进位 pd 为 true,则返回整个链表,包括哑节点 list,因为哑节点的值为 1 代表了最后的进位,如果没有进位,则跳过哑节点,返回 list->next 作为结果链表。
if(pd){
return list;
}
return list->next;
}
};
查看30道真题和解析