Add Two Numbers,addtwonumbers
題目意思很簡單,兩個鏈表分別表示兩個數,將兩個數相加的結果存入一個新的鏈表中。
思路同樣很簡單:兩個鏈表如果一樣長,對應位置相加,如果某一個鏈表多了,則根據加的結果有無進位繼續處理,全部結束後要考慮會不會還剩進位。
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 Numbers
PS :
調用和返回都使用了p->next的方式,因為沒有把頭指針傳進去。