2_Add Two Numbers --LeetCode
原题如下:
思路:在一个while中遍历两个链表,直到最长的链表为空,或者没有进位。每一步获取两个链表对应的结点的值a,b,然后相加a+b。如果上一步又进位,那就加a+b+1,若由于进位加1后还产生进位,则设置进位标识位为true。如果a+b大于9,也要设置进位标识为true。
代码如下:
1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 class Solution { 10 public: 11 ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { 12 //异常输入验证 13 if(NULL==l1 && NULL==l2) 14 { 15 ListNode* LN = (ListNode*)malloc(sizeof(ListNode)); 16 LN->val = 0; 17 LN->next = NULL; 18 return LN; 19 } 20 21 if(NULL == l2 && NULL !=l1) 22 return l1; 23 24 if(NULL == l1 && NULL !=l2) 25 return l2; 26 27 bool carry = false; //进位标识符 28 ListNode* p = l1,*q = l2,* L = NULL,*s = NULL,*pl; 29 30 //创建头结点,后面会删除掉。 31 if(!(L = (ListNode*)malloc(sizeof(ListNode)))) 32 return L; 33 L->val = 0; 34 L->next = NULL; 35 pl = L; 36 while(p!=NULL || q!=NULL || carry) 37 { 38 39 int pos1=0,pos2=0,remain=0, sum = 0; 40 41 //以下两个if是获取两个链表中的值 42 if(p!=NULL) 43 { 44 pos1 = p->val; 45 p=p->next; 46 } 47 48 if(q!=NULL) 49 { 50 pos2 = q->val; 51 q=q->next; 52 } 53 54 //相加 55 sum = pos1+pos2; 56 //求余 57 remain = sum%10; 58 //创建结点 59 if(!(s = (ListNode*)malloc(sizeof(ListNode)))) 60 return s; 61 //如果上一步又进位 62 if(carry){ 63 //再次判断进位后是否还进位 64 if(remain+1>9){ 65 s->val=0; 66 carry = true; 67 }else{ 68 s->val = remain+1; 69 carry = false; 70 } 71 72 }else 73 s->val=remain; 74 //添加结点到链表中 75 s->next = NULL; 76 pl->next = s; 77 pl = s; 78 79 //判断是否进位 80 if(sum>9) 81 carry = true; 82 } 83 84 //删除结点 85 pl = L; 86 L = L->next; 87 free(pl); 88 89 return L; 90 } 91 };
手与大脑的距离决定了理想与现实的相似度