当前位置: 代码迷 >> 综合 >> Leetcode 2 两数相加 学习感悟
  详细解决方案

Leetcode 2 两数相加 学习感悟

热度:41   发布时间:2024-02-24 18:26:19.0

思路: 

首先分4种情况讨论:

p1 ,p2 哨兵都存在 ,正常相加求和取余,分离个位和十位。个位存入新节点,十位给carry ,  p1++,p2++

p1存在,p2不存在,将carry带上和p2数字正常相加求和取余,分离个位和十位 ,个位存入新节点,十位给carry ,  p1++

p2存在,p1不存在,将carry带上和p1数字正常相加求和取余,分离个位和十位,个位存入新节点,十位给carry ,  p2++

p1,p2,都不存在,carry存在,将carry存入新节点置0,结束整个工作.

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {public:ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {ListNode* p1 = l1;ListNode* p2 = l2;//两哨兵ListNode* NewHead = NULL;//新链表的头ListNode* p = NewHead;//新链表的哨兵int sum = 0;//求和int carry = 0;//进阶while (p1 || p2||carry) {//p1.p2有一个存在//二者均存在if (p1 && p2) {sum = p1->val + p2->val + carry;carry = sum / 10;//十位sum = sum % 10;//个位if (!NewHead) {//第一个节点头节点为空NewHead = new ListNode(sum);p = NewHead;}else {p->next= new ListNode(sum);p = p->next;}p1 = p1->next; p2 = p2->next;}//有一个不存在else if (!p1&&p2) {//p1不存在//进位加p2无限挖过来while (p2) {sum = p2->val + carry;carry = sum / 10;//十位sum = sum % 10;//个位if (!NewHead) {//第一个节点头节点为空NewHead = new ListNode(sum);p = NewHead;}else {p->next = new ListNode(sum);p = p->next;}p2 = p2->next;}}else if (!p2&&p1) {  //p2不存在//进位加p1无限挖过来while (p1) {sum = p1->val + carry;carry = sum / 10;//十位sum = sum % 10;//个位if (!NewHead) {//第一个节点头节点为空NewHead = new ListNode(sum);p = NewHead;}else {p->next = new ListNode(sum);p = p->next;}p1 = p1->next;}}else {//p1,p2都不存在,但存在carryp->next = new ListNode(carry);p = p->next;carry = 0;}}return NewHead;}
};