题解 | #链表相加(二)#
链表相加(二)
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; } };