力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
我们模拟两个数相加,遍历两个链表。至于顺序,虽然是相反的,但是我们重新创建一个带头结点的链表的时候,直接让两个数相加就可以了进位向后面链接就行!
如果两个数长度不同,那么让那个短的位补0,也就是当一个数还没遍历完,但是另一个数已经遍历完毕了,那么就让短的那个数遍历的结点填补0。最后还要判断是否有进位,如果有进位,那么把该数继续接入链表后面,说明最后一次相加的时候有进位没有进行处理。
两个数相加sum=num1+num2+carry,下一位需要进的位carry=sum/10,当前位剩下的数sum%10。
- /**
- * 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* head=nullptr,*tail=nullptr;
- // 若其中一个链表先遍历到nullptr时
- // 再次遍历到该链表的结点就视为0
- int carry=0;
- while(l1||l2)
- {
- // 若为nullptr就取0
- int num1=l1?l1->val:0;
- int num2=l2?l2->val:0;
- int sum=num1+num2+carry;
- if(head==nullptr)
- head=tail=new ListNode(sum%10);
- else
- {
- tail->next=new ListNode(sum%10);
- tail=tail->next;
- }
- carry=sum/10;
- if(l1) l1=l1->next;
- if(l2) l2=l2->next;
- }
- if(carry>0)
- tail->next=new ListNode(carry);
- return head;
- }
- };