面试12之给定两个链表ListNode* A,ListNode* B,请返回A+B的结果


有两个用链表表示的整数,每个结点包含一个数位。这些数位是反向存放的,也就是个位排在链表的首部。编写函数对这两个整数求和,并用链表形式返回结果。
给定两个链表ListNode* A,ListNode* B,请返回A+B的结果(ListNode*)。
测试样例:
{1,2,3},{3,2,1}

返回:{4,4,4}


本题的思路很简单,按照小学数学中学习的加法原理从末尾到首位,对每一位对齐相加即可。技巧在于如何处理不同长度的数字,以及进位和最高位的判断。这里对于不同长度的数字,我们通过将较短的数字补0来保证每一位都能相加。尤其是别忘了最高位有可能有进位。


#include<iostream>
using namespace std;

struct ListNode
{
	int val;
	struct ListNode *next;
	ListNode(int x):val(x),next(NULL)
	{

	}
};

ListNode* PlusAB(ListNode *a, ListNode*b)
{
	if(a == NULL)
		return b;
	if(b == NULL)
		return a;

	ListNode *pa = a;
	ListNode *pb = b;
	int step = 0;
	int sum = 0;
	ListNode *newHead = NULL;
	ListNode *pCur = newHead;
	
	while (pa != NULL ||pb != NULL)
	{
		
		int Aval = (pa == NULL ? 0 :pa->val);//注意当两个链表不一样长的时候,有一个链表肯定要先走到末尾,不能一直用pa->val或pb->val
		int Bval = (pb == NULL ? 0 :pb->val);
		sum = Aval + Bval+step;

		ListNode *pm = new ListNode(sum%10);

		if(newHead == NULL) //新链表的第一个节点
		{
			newHead = pm;
			pCur = newHead;
		}
		else
		{
			pCur->next = pm;
			pCur = pm;
		}
		
		step = sum / 10;

		pa = (pa != NULL ? pa->next :NULL);
		pb = (pb != NULL ? pb->next :NULL);
	}
	if(step != 0) //最高位有可能有进位。
	{
		
		ListNode *pm = new ListNode(step);
		pCur->next = pm;
	}
	return newHead;
}

void test()
{
	ListNode *p1 = new ListNode(6);
	ListNode *p2 = new ListNode(5);
	ListNode *p3 = new ListNode(4);
	p1->next = p2;
	p2->next = p3;
	
	ListNode *p4 = new ListNode(3);
	ListNode *p5 = new ListNode(2);
	ListNode *p6 = new ListNode(1);
	p4->next = p5;
	p5->next = p6;

	ListNode *phead = PlusAB(p1,p4);

	while(phead)
	{
		cout << phead->val << " ";
		phead = phead->next;
	}
}

int main()
{
	test();
	cout << "hello..." <<endl;
	return 0;
}




评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值