Java_集合

Vue面试集合

  返回  

力扣第二题:两数相加

2021/8/21 18:37:55 浏览:

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例 1:
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.

示例 2:
输入:l1 = [0], l2 = [0]
输出:[0]

示例 3:

输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]

解题思路:
因两个链表均为非空
所以结果链表至少有一个节点,记为头节点head。
定义一个int变量flag(用于进位)
只要两个链表其中一个不为空 就进入运算循环

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
 struct ListNode {
	int val;
	ListNode* next;
	ListNode() : val(0), next(nullptr) {}
	ListNode(int x) : val(x), next(nullptr) {}
	ListNode(int x, ListNode* next) : val(x), next(next) {}
};
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)
{
	ListNode* head = new ListNode();  //head结点
	ListNode* p = head; //p初始指向head
	int temp = 0;//用于计算新节点in的value
	int flag = 0;//用于进位
	int judge = 1;//只用一次用来判断是不是第一次
	while (!(l1==nullptr&&l2==nullptr)) 
	{
		if(judge!=1)
		{  //第一次不用new
			ListNode* in = new ListNode();
			p->next = in;
			p = p->next;
		}
		judge = 0;
		if (l1==nullptr) //l1为空则l2肯定不为空(否则进不来循环)
		{
			temp=l2->val + flag;   //temp只需计算flag和l2->val 
			l2 = l2->next;
		}
		else//l1不为空,l2可能为空,也可能不为空
		{               
			if (l2 == nullptr)
			{  //l1不空,l2空
				temp = l1->val + flag;  //temp只需计算flag和l1->value
			}
			else   //l1,l2都不为空
			{
				temp = l1->val +l2->val+ flag;
				l2 = l2->next;
			}
			l1 = l1->next;
		}
		p->val=temp % 10; //temp>10则需对10求模

		//计算进位
		if (temp >= 10)
			flag = 1;  
		else 
			flag = 0;
	}


	//考虑到最后的进位 需不需要多一个节点
	if (flag == 1) {  
		ListNode* in = new ListNode(1);
		p->next = in;
		p = in;
	}
	return head;
 }
int main()
{
	ListNode* l1 = new ListNode();
	ListNode* p1 = l1;
	ListNode* l2 = new ListNode();
	ListNode* p2 = l2;
	cout << "请输入l1的个数:";
	int num,i;
	cin >> num;
	for (i = 0; i < num; i++) {
		cout << "请输入l1的第"<<i+1<<"个数据:";
		cin >> p1->val;
		if(i!=num-1)
		{
			ListNode* in = new ListNode();
			p1->next = in;
			p1 = in;
		}

	}
	cout << "请输入l2的个数:";
	cin >> num;
	for (i = 0; i < num; i++) {
		cout << "请输入l2的第" << i + 1 << "个数据:";
		cin >> p2->val;
		if (i != num - 1)
		{
			ListNode* in = new ListNode();
			p2->next = in;
			p2 = in;
		}

	}
	cout << endl << "结果:" << endl;
	ListNode* ret = addTwoNumbers(l1, l2);
	while (ret) {
		cout << ret->val << endl;
		ret = ret->next;
	}
	cout << "=========================" << endl;
	cout << "链表1:" << endl;
	while (l1) {
		cout << l1->val << endl;
		l1 = l1->next;
	}
	cout << "=========================" << endl;
	cout << "链表2:" << endl;
	while (l2) {
		cout << l2->val << endl;
		l2 = l2->next;
	}
	return 0;
}

运行结果

在这里插入图片描述

在这里插入图片描述

联系我们

如果您对我们的服务有兴趣,请及时和我们联系!

服务热线:18288888888
座机:18288888888
传真:
邮箱:888888@qq.com
地址:郑州市文化路红专路93号