題目意思很簡單,兩個鏈表分別表示兩個數,將兩個數相加的結果存入一個新的鏈表中。
思路同樣很簡單:兩個鏈表如果一樣長,對應位置相加,如果某一個鏈表多了,則根據加的結果有無進位繼續處理,全部結束後要考慮會不會還剩進位。
c++的鏈表,題目已經給了一個挺好的例子:
struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} };
對於創建鏈表可以使用一個頭節點來一直指向這個鏈表,頭節點中沒有數據
ListNode *l1,*l1head; l1=new ListNode(0); l1head=l1; for(int i=0;i<n;i++) { scanf("%d",&temp); ListNode *tempnode=new ListNode(temp); l1->next=tempnode; l1=l1->next; }
接下來直接進行比較,情況考慮周全即可,比較危險的數據有
[5],[5] ; [1],[99]
1 class Solution { 2 public: 3 ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { 4 ListNode *res, *head; 5 res = new ListNode(0); 6 head = res; 7 int flag = 0; 8 while (l1 != NULL && l2 != NULL) { 9 ListNode *tempNode = new ListNode(0); 10 int temp = l1->val + l2->val + flag; 11 if (temp >= 10) { 12 flag = 1; 13 tempNode->val = temp % 10; 14 } else { 15 flag = 0; 16 tempNode->val = temp; 17 } 18 19 l1 = l1->next; 20 l2 = l2->next; 21 res->next = tempNode; 22 res = res->next; 23 } 24 while (l1 != NULL) { 25 ListNode *tempNode = new ListNode(0); 26 27 if (flag == 1) { 28 29 tempNode->val = l1->val + flag; 30 if (tempNode->val >= 10) { 31 flag = 1; 32 tempNode->val = tempNode->val % 10; 33 } else { 34 flag = 0; 35 } 36 l1 = l1->next; 37 res->next = tempNode; 38 res = res->next; 39 } else { 40 res->next = l1; 41 break; 42 } 43 44 } 45 while (l2 != NULL) { 46 ListNode *tempNode = new ListNode(0); 47 48 if (flag == 1) { 49 50 tempNode->val = l2->val + flag; 51 if (tempNode->val >= 10) { 52 flag = 1; 53 tempNode->val = tempNode->val % 10; 54 } else { 55 flag = 0; 56 } 57 l2 = l2->next; 58 res->next = tempNode; 59 res = res->next; 60 } else { 61 res->next = l2; 62 break; 63 } 64 65 } 66 if (flag == 1) { 67 ListNode *tempNode = new ListNode(1); 68 res->next = tempNode; 69 } 70 return head->next; 71 } 72 }; Add Two NumbersPS :
調用和返回都使用了p->next的方式,因為沒有把頭指針傳進去。