链表求和
两个链表生成相加链表
http://www.nowcoder.com/questionTerminal/c56f6c70fb3f4849bc56e33ff2a50b6b
题目描述
假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。
给定两个这种链表,请生成代表两个整数相加值的结果链表。
例如:链表 1 为 9->3->7,链表 2 为 6->3,最后生成新的结果链表为 1->0->0->0。
解法
//解法:模拟法 // 1. 高->低位 链表, 反转为,低->高位链表. // 2. 模拟两数相加:从低到高,逐位相加进位。 //时间:O(N), 空间O(1) ListNode* addInList(ListNode* head1, ListNode* head2) { if (!head1 || !head2) return head1? head2: head1; ListNode* l1 = reverse(head1); ListNode* l2 = reverse(head2); int carry = 0; ListNode dummy(0); ListNode* cur = &dummy; while (l1 || l2) { int v1 = l1? l1->val: 0; int v2 = l2? l2->val: 0; int v = v1 + v2 + carry; cur->next = new ListNode(v % 10); carry = v / 10; l1 = l1 ? l1->next: nullptr; l2 = l2 ? l2->next: nullptr; cur = cur->next; } if (carry != 0) { cur->next = new ListNode(carry); cur = cur->next; } return reverse(dummy.next); } ListNode* reverse(ListNode* head) { if (head == nullptr) return head; ListNode* cur = head; ListNode* prev = nullptr; while (cur) { ListNode* post = cur->next; //反转当前节点 cur->next = prev; //移动游标到下一节点 prev = cur; cur = post; } return prev; }