You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
Analysis:Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
This problem is quite straight-forward: we traverse the linked list and add corresponding node's values from two given lists to form a new list.
There are several corner cases to consider:
1) Two lists may have different length: we need to consider the extra nodes from longer list.
2) Carry: we need to remember the carry - 1 or 0 - from previous node(s). If it's end of the list and there's a carry, we need to create a new node with value 1.
Code:
/** * 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) { if (l1==NULL && l2==NULL) return NULL; ListNode* h1=l1, *h2=l2; // add first node ListNode* l3=new ListNode((h1->val+h2->val)%10); int carry=(h1->val+h2->val>=10)?1:0; h1=h1->next; h2=h2->next; ListNode* prev=l3; // traverse while(h1!=NULL && h2!=NULL) { ListNode* tmp=new ListNode((h1->val+h2->val+((carry==1)?1:0))%10); carry=(h1->val+h2->val+((carry==1)?1:0)>=10)?1:0; prev->next=tmp; prev=prev->next; h1=h1->next; h2=h2->next; } // If list 1 is longer than list 2 if (h1!=NULL) { while(h1!=NULL) { ListNode* tmp=new ListNode((h1->val+((carry==1)?1:0))%10); carry=(h1->val+((carry==1)?1:0)>=10)?1:0; prev->next=tmp; prev=prev->next; h1=h1->next; } } // If list 2 is longer than list 1 if (h2!=NULL) { while(h2!=NULL) { ListNode* tmp=new ListNode((h2->val+((carry==1)?1:0))%10); carry=(h2->val+((carry==1)?1:0)>=10)?1:0; prev->next=tmp; prev=prev->next; h2=h2->next; } } // If there's carry at the last node - create a new node->val=1 if (h1==NULL && h2==NULL && carry==1) { ListNode* tmp=new ListNode(1); prev->next=tmp; } return l3; } };
No comments:
Post a Comment