《Cracking the Coding Interview程式設計師面試金典》----連結串列A+B

塵封的記憶0發表於2017-04-28
時間限制:3秒 空間限制:32768K 熱度指數:3125
本題知識點: 程式設計基礎 連結串列
 演算法知識視訊講解

題目描述

有兩個用連結串列表示的整數,每個結點包含一個數位。這些數位是反向存放的,也就是個位排在連結串列的首部。編寫函式對這兩個整數求和,並用連結串列形式返回結果。

給定兩個連結串列ListNode* A,ListNode* B,請返回A+B的結果(ListNode*)。

測試樣例:
{1,2,3},{3,2,1}

返回:{4,4,4}


思路:題目描述為相加兩個給出的連結串列A與B,比如說:{1,2,3} + {3,2,1}需要返回一個結果連結串列為{4,4,4}。
在中間的加法運算中主要分為兩步,第一步計算每每兩個數字相加的結果,第二部提取出相應結果的進位和需要保留的個位數結果。定義兩個新的ListNode結構的新連結串列,一個用來做最後返回的連結串列頭,一個作為連結串列的儲存。因為不知道兩個給定的連結串列長度,所以判斷的時候兩個連結串列都判斷是否為NULL再進入迴圈來遍歷兩個連結串列。當遍歷時判斷一下最終返回連結串列的頭節點,下面為完整的程式碼示例:

/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};*/
class Plus {
public:
	ListNode* plusAB(ListNode* a, ListNode* b) {
		// write code here
		ListNode* pNode = NULL;
		ListNode* pHead = NULL;
		int carry = 0;
		if (a == NULL && b == NULL)
			return NULL;
		while (a || b || carry>0){
			int val1, val2;
			val1 = a ? a->val : 0;
			val2 = b ? b->val : 0;
			int val = val1 + val2 + carry;
			carry = val / 10;

			ListNode* temp = new ListNode(val % 10);
			if (pNode == NULL){
				pNode = temp;
				pHead = pNode;
			}
			else{
				pNode->next = temp;
				pNode = pNode->next;
			}
			a = a ? a->next : NULL;
			b = b ? b->next : NULL;
		}
		pNode->next = NULL;
		return pHead;
	}
};

不懂的可以加我的QQ群:261035036(IT程式設計師面試寶典

群) 歡迎你到來哦,看了博文給點腳印唄,謝謝啦~~


相關文章