[LeetCode] Add Two Numbers(連結串列合併+模擬加法)
阿新 • • 發佈:2018-11-17
You are given two non-empty linked lists representing two non-negative integers. 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.
You may assume the two numbers do not contain any leading zero, except the number 0 itself.
Example:
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4) Output: 7 -> 0 -> 8 Explanation: 342 + 465 = 807.
題意:給出兩個連結串列,每一個連結串列代表著一個數,要求把兩個連結串列所得到的數相加,得到第三個連結串列,注意連結串列的第一個數為這個數的最後一位,沒有前導零,除了0本身。
思路:一開始想著把兩個連結串列所表示的數算出來再相加,再轉化為連結串列,然後發現樣例中有很大很大的數,只能模擬加法,模擬加法的時候注意進位。
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode addTwoNumbers(ListNode l1,ListNode l2) { //設定一個空節點 ListNode l3 = new ListNode(0),head = l3; int add = 0,temp; while(l1 != null && l2 != null) { if(add + l1.val + l2.val >= 10) { temp = add + l1.val + l2.val - 10; add = 1; } else { temp = add + l1.val + l2.val; add = 0; } l3.next = new ListNode(temp); l3 = l3.next; l1 = l1.next; l2 = l2.next; } while(l1 != null) { if(add + l1.val >= 10) { temp = add + l1.val - 10; add = 1; } else { temp = add + l1.val; add = 0; } l3.next = new ListNode(temp); l3 = l3.next; l1 = l1.next; } while(l2 != null) { if(add + l2.val >= 10) { temp = add + l2.val - 10; add = 1; } else { temp = add + l2.val; add = 0; } l3.next = new ListNode(temp); l3 = l3.next; l2 = l2.next; } if(add == 1) { l3.next = new ListNode(1); l3 = l3.next; add = 0; } l3.next = null; return head.next; } }
C語言程式碼:
/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) { //ListNode l3 = new ListNode(0),head = l3; struct ListNode *l3, *head; l3 = (struct ListNode*)malloc(sizeof(struct ListNode)); head = l3; int add = 0,temp; while(l1 != NULL && l2 != NULL) { if(add + l1 -> val + l2 -> val >= 10) { temp = add + l1 -> val + l2 -> val - 10; add = 1; } else { temp = add + l1 -> val + l2 -> val; add = 0; } l3 -> next = (struct ListNode*) malloc(sizeof(struct ListNode)); l3 -> next -> val = temp; l3 = l3 -> next; l1 = l1 -> next; l2 = l2 -> next; } while(l1 != NULL) { if(add + l1 -> val >= 10) { temp = add + l1 -> val - 10; add = 1; } else { temp = add + l1 -> val; add = 0; } l3 -> next = (struct ListNode*) malloc(sizeof(struct ListNode)); l3 -> next -> val = temp; l3 = l3 -> next; l1 = l1 -> next; } while(l2 != NULL) { if(add + l2 -> val >= 10) { temp = add + l2 -> val - 10; add = 1; } else { temp = add + l2 -> val; add = 0; } l3 -> next = (struct ListNode*) malloc(sizeof(struct ListNode)); l3 -> next -> val = temp; l3 = l3 -> next; l2 = l2 -> next; } if(add == 1) { l3 -> next = (struct ListNode*) malloc(sizeof(struct ListNode)); l3 -> next -> val = 1; l3 = l3 -> next; add = 0; } l3 -> next = NULL; return head -> next; }