leetcode2. 两数相加
使用迭代的方式
class Solution{ public: ListNode *addTwoNumbers(ListNode* l1,ListNode *l2) { ListNode *res=new ListNode(-1); ListNode *p=res; int temp=0,increase=0; while(l1 && l2) { temp=l1->val+l2->val+increase; ListNode *r = new ListNode(-1); if(temp>=10) increase=1; else increase=0; r->val=temp%10; res->next=r; res=res->next; l1=l1->next; l2=l2->next; } while(l1) { ListNode *r = new ListNode(-1); temp=l1->val+increase; if(temp>=10) increase=1; else increase=0; r->val=temp%10; res->next=r; res=res->next; l1=l1->next; } while(l2) { ListNode *r = new ListNode(-1); temp=l2->val+increase; if(temp>=10) increase=1; else increase=0; r->val=temp%10; res->next=r; res=res->next; l2=l2->next; } if(increase==1) { ListNode *r = new ListNode(1); res->next=r; } return p->next; } };
其实还有更简洁的书写方式,我上面是用了三个while,其实一个while就够了,如下,更加优雅,摘自Leetcode,侵删
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode addTwoNumbers(ListNode l1, ListNode l2) { ListNode DummyHead = new ListNode(0); // 初始化一个伪头结点 ListNode pre = DummyHead; // 用 pre 记录要创建并赋值的节点的前一个节点 int Carry = 0; // 初始化进位 while( l1 != null || l2 != null || Carry > 0) // 继续相加的条件是 链表对应位置中存在不为空的节点 或 有进位 { int sum = ((l1 != null) ? l1.val : 0) + ((l2 != null) ? l2.val : 0) + Carry; //计算对应位的和(需要加上进位) Carry = sum / 10; // 记录下次相加的进位 pre.next = new ListNode(sum % 10); // 创建并赋值下个节点 pre = pre.next; // pre 移动到新创建的节点位置上,便于下一轮继续创建新节点 /* 当节点不为空的时候,指向它的下一个节点(之前判断的是其后节点是否为空,导致超时,因为与while的条件不匹配) */ if(l1 != null) l1 = l1.next; if(l2 != null) l2 = l2.next; } return DummyHead.next; // 返回有数据的第一个节点,也就是伪节点的下一个节点 } }