Add Two Numbers II 两数相加 II

给定两个非空链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储单个数字。将这两数相加会返回一个新的链表。

 

你可以假设除了数字 0 之外,这两个数字都不会以零开头。

进阶:

如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。

示例:

输入: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
输出: 7 -> 8 -> 0 -> 7

观察给的样例输出,有进位且类似链表的逆序相加再逆序输出,受此启发可以用两个栈来实现first,second,第一次遍历把第一个链表的数放入first,第二个链表的数放入second。然后从first和second不断取数逆序构造链表即可,注意进位问题。

程序如下:

    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
	  if (!l1 && !l2) {
		  return l1;
	  }
	  if (!l1 && l2) {
		  return l2;
	  }
	  if (l1 && !l2) {
		  return l1;
	  }
	  stack<ListNode*> first;
	  stack<ListNode*> second;
	  while (l1 || l2) {
		  if (l1) {
			  first.push(l1);
			  l1 = l1->next;
		  }
		  if (l2) {
			  second.push(l2);
			  l2 = l2->next;
		  }
	  }
	  ListNode* node_next = nullptr;
	  ListNode* node = nullptr;
	  int carry = 0;
	  while (!first.empty() || !second.empty() || carry) {
		  int sum = ((!first.empty())? first.top()->val:0) + ((!second.empty()) ? second.top()->val : 0) + carry;
		  node = new ListNode(sum % 10);
		  node->next = node_next;
		  node_next = node;
		  if (!first.empty()) {
			  first.pop();
		  }
		  if (!second.empty()) {
			  second.pop();
		  }
		  carry = sum / 10;
	  }
	  return node;       
    }



猜你喜欢

转载自blog.csdn.net/qq_26410101/article/details/80445094