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
The idea is adding digit by digit with the use of carry_on bit. Note that after adding two linked list, we need to check if there are still remaining elements in either list.
C++ Code:
struct ListNode{ int val; ListNode *next; ListNode(int x) : val(x), next(NULL){} }; /* *func: add_two_numbers *goal: add two non-negtive numbers represented by link list *@param l1: the head of linked list 1 *@param l2: the head of linked list 2 *return: the head of the new linked list representing the sum */ /* *Just Add one bit by one bit *Time complexity: O(m+n), space complexity: O(m+n) where m is the *length of l1 and n is the length of l2 */ ListNode* add_two_numbers(ListNode *l1, ListNode *l2){ //iterator for l1 and l2 ListNode *iter1 = l1, *iter2 = l2; //head of final result and iterator of final result ListNode *head = NULL, *iter_ret = new ListNode(0); //carry on variable bool carry_on = false; while(iter1 != NULL && iter2!= NULL){ int sum = iter1->val + iter2->val + carry_on; //Set carry_on bit carry_on = sum >= 10 ? true : false; //Create new node iter_ret->next = new ListNode(sum >= 10 ? sum-10 : sum); //Set head pointer if(head == NULL){ head = iter_ret->next; } //Go to the next one iter_ret = iter_ret->next; iter1 = iter1->next; iter2 = iter2->next; } //Check tail of iter1 while(iter1 != NULL){ int sum = iter1->val + carry_on; //Set carry_on bit carry_on = sum >= 10 ? true : false; //Create new node iter_ret->next = new ListNode(sum >= 10 ? sum-10 : sum); //Set head pointer if(head == NULL){ head = iter_ret->next; } //Go to the next one iter_ret = iter_ret->next; iter1 = iter1->next; } //Check tail of iter2 while(iter2 != NULL){ int sum = iter2->val + carry_on; //Set carry_on bit carry_on = sum >= 10 ? true : false; //Create new node iter_ret->next = new ListNode(sum >= 10 ? sum-10 : sum); //Set head pointer if(head == NULL){ head = iter_ret->next; } //Go to the next one iter_ret = iter_ret->next; iter2 = iter2->next; } //Check carry on if(carry_on){ iter_ret->next = new ListNode(1); } return head; }
Python Code:
class ListNode: def __init__(self, x): self.val = x self.next = None #func: add two numbers represented by linked list #@param l1: the head of l1 #@param l2: the head of l2 #@return: the head of the final result #Complexity: time O(m+n), space O(m+n) def add_two_numbers(l1, l2): #iterator for l1 and l2 iter1 = l1 iter2 = l2 #head of final result and iterator of final result iter_ret = ListNode(0) head = None #carry_on digit carry_on = False while iter1 and iter2: #Compute sum sum = iter1.val + iter2.val + carry_on #Set carry_on bit carry_on = True if sum >= 10 else False #Create new node iter_ret.next = ListNode(sum - 10 if sum >= 10 else sum) #Set head if not head: head = iter_ret.next #Go to the next one iter_ret = iter_ret.next iter1 = iter1.next iter2 = iter2.next #Check tail of iter1 while iter1: #Compute sum sum = iter1.val + carry_on #Set carry_on bit carry_on = True if sum >= 10 else False #Create new node iter_ret.next = ListNode(sum - 10 if sum >= 10 else sum) #Set head if not head: head = iter_ret.next #Go to the next one iter_ret = iter_ret.next iter1 = iter1.next #Check tail of iter2 while iter2: #Compute sum sum = iter2.val + carry_on #Set carry_on bit carry_on = True if sum >= 10 else False #Create new node iter_ret.next = ListNode(sum - 10 if sum >= 10 else sum) #Set head if not head: head = iter_ret.next #Go to the next one iter_ret = iter_ret.next iter2 = iter2.next #Check carry_on bit if carry_on: iter_ret.next = ListNode(1) return head
No comments:
Post a Comment