1. 程式人生 > >【LeetCode】Add Two Numbers(兩數相加)

【LeetCode】Add Two Numbers(兩數相加)

handle bae gif return one cast select inline 產生

這道題是LeetCode裏的第2到題。

這道題的條件判斷很簡單,如下:

1.是否為尾節點

2.是否產生進位

3.是否等於9

4.是否需要拓展空間

代碼如下:

ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
	ListNode *p = l1, *q = l2;
	int add, carry = 0;//carry標誌進位

	while (1) {
		add = p->val + q->val + carry;
		p->val = add % 10;
		if (add > 9)carry = 1;
		else carry = 0;
		if (p->next == NULL || q->next == NULL)break;//直到最後一個節點
		p = p->next;
		q = q->next;
	}

    //這裏就相當於是一個鏈表只有一個節點,另一個鏈表加上這個一個節點的數值
	if (p->next) {//list1
		p = p->next;
		q = p;
		while (carry) {//是否需要進位
			if (q->val == 9) {//是否等於9
				if (q->next == NULL) {//是否是最後一個節點
					q->val = 0;
					q->next = (ListNode*)malloc(sizeof(ListNode));
					q->next->val = 1;
					q->next->next = NULL;
					break;
				}
				q->val = 0;
				q = q->next;}
			else {q->val++;carry = 0;}
		}
		return l1;
	}

	if (q->next) {//list2
		q = q->next;
		list2 = q;//
		while (carry) {
			if (q->val == 9) {
				if (q->next == NULL) {
					q->val = 0;
					q->next = (ListNode*)malloc(sizeof(ListNode));
					q->next->val = 1;
					q->next->next = NULL;
					break;
				}
				q->val = 0;
				q = q->next;}
			else {q->val++;carry = 0;}
		}
		p->next = l2;
		return l1;
	}

	if (carry) {
		q = (ListNode*)malloc(sizeof(ListNode));
		q->next = NULL;
		q->val = 1;
		p->next = q;
	}
	return l1;
}

運行結果

技術分享圖片技術分享圖片?

個人總結:在設計算法初期,造成了許多代碼的累贅,以上代碼是經過優化後得到的。但是在這裏兩個if條件中還是會有代碼的重復,但能夠做出來我就已經很開心了。(^-^)V

  

【LeetCode】Add Two Numbers(兩數相加)