链表模拟加法/字符串模拟二进制加法/数组模拟加一操作/打印1到最大的n位数/字符串模拟乘法
============================================
Add Two Numbers
两个链表代表两个数字,每个结点的值都是一位数字,单链表逆序存放这两个数字,
构造出一个新的链表,代表这两个链表的和。
链表的尾插法,头结点dummy结点的运用,统一对prev指针的操作,
/** * 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) { /*头结点,dummy主要是为了保持prev的统一操作*/ ListNode dummy(-1); int carry = 0; ListNode *prev = &dummy; ListNode *p1 = l1, *p2 = l2; while(p1 != NULL || p2 != NULL) { const int aCur = (p1 == NULL) ? 0 : p1->val; const int bCur = (p2 == NULL) ? 0 : p2->val; const int value = (aCur + bCur + carry) % 10; carry = (aCur + bCur + carry) / 10; /*尾插法*/ prev->next = new ListNode(value); p1 = (p1 == NULL) ? NULL : p1->next; p2 = (p2 == NULL) ? NULL : p2->next; prev = prev->next; } if(carry > 0) { prev->next = new ListNode(carry); } return dummy.next; } };
Add Binary
两个字符串模拟二进制的加法,二进制的字符串都是正序存放的,区别于链表模拟加法的题目,
插入的时候,有头插法和尾插法。这里显然要用到头插法。
class Solution { public: string addBinary(string a, string b) { string result; const int n = a.size() > b.size() ? a.size() : b.size(); /*反转过来,然后从左到右计算*/ reverse(a.begin(), a.end()); reverse(b.begin(), b.end()); int carry = 0; for(int i = 0; i < n; ++i) { /*有一方,超过了长度就把这一方的设置为0*/ const int aCur = i < a.size() ? a[i] - '0' : 0; const int bCur = i < b.size() ? b[i] - '0' : 0; /*余数*/ const int val = (aCur + bCur + carry) % 2; /*进位*/ carry = (aCur + bCur + carry) / 2; /*头插法*/ result.insert(result.begin(), val + '0'); } if(carry == 1) { result.insert(result.begin(), '1'); } return result; } };
更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/sjjg/
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索字符串
, int
, null
, 结点
, 模拟
, c语言 链表 加法
, 加法
, 加法操作
乘法模拟
链表加法、二年级乘法加减法混合、excel加法公式 加一列、加法原理和乘法原理、乘法对加法的分配律,以便于您获取更多的相关知识。