http://oj.leetcode.com/problems/add-two-numbers/
将用链表表示的两个数相加,(2 -> 4 -> 3) + (5 -> 6 -> 4) 就是342 + 465.刚开始把题目给理解错了,做复杂了。
主要是对指针的理解。
ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) { // IMPORTANT: Please reset any member data you declared, as // the same Solution instance will be reused for each test case. if(l1==NULL) return l2; if(l2==NULL) return l1; int sum; int carry = 0; ListNode *ans = l1; ListNode *ans3 = ans; //最后结果存到l1 ans while(l1&&l2) { sum = l1->val + l2->val + carry; carry = sum/10; if(carry) l1->val = sum - 10; else l1->val = sum; l1 = l1->next; l2 = l2->next; } if(l1==NULL &&l2==NULL) { if(carry == 0) return ans; //找到最后一个节点 while(ans3->next) ans3 = ans3->next; ListNode *temp = new ListNode(1); ans3->next = temp; return ans; } //将两种情况化成一种 if(l1 == NULL) { while(ans3->next) ans3 = ans3->next; ans3->next = l2; l1 = l2; l2 = NULL; } //要看最高位进位的情况 if(carry == 0) return ans; while(carry == 1 && l1) { l1->val += carry; if(l1->val > 9) { l1->val = l1->val %10; carry = 1; l1 = l1->next; } else return ans; } if(carry == 1) { while(ans3->next) ans3 = ans3->next; ListNode *temp = new ListNode(1); ans3->next = temp; } return ans; }
int main() { ListNode *l1 = new ListNode(2); ListNode *n1 = new ListNode(4); ListNode *n5 = new ListNode(4); ListNode *l2 = new ListNode(5); ListNode *n4 = new ListNode(6); ListNode *n6 = new ListNode(4); //ListNode *n8 = new ListNode(8); l1->next = n1; n1->next = n5; l2->next = n4; n4->next = n6; //n6->next = n8; Solution myS; ListNode *temp = myS.addTwoNumbers(l2,l1); return 0; }
囧,读复杂了,还做了个链表的翻转。
ListNode *reverse(ListNode * l2) { ListNode *n1,*n2,*before; n1 = l2; n2 = n1->next; before = NULL; while(n2) { n1->next = before; before = n1; n1 = n2; n2 = n2->next; } n1->next = before; return n1; }
三个指针做链表的反转。