zoukankan      html  css  js  c++  java
  • 2两数相加

    1、问题描述

    问题描述:
    	给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
    	如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
    	您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
    
    示例:
    	输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
    	输出:7 -> 0 -> 8
    	原因:342 + 465 = 807
    

    2、解决思路

    解决思路:
    	当给定的两个链表都不为空时,进行加法,添加新节点,并设置进位;
    	当一个表为空,另一表不为空,进行赋值(注意如果前面有进位,需要加1),添加新节点,并设置进位;
    	最后两个表都为空,做检查是否产生进位,如果产生进位,还需要新添加一个新节点。
    

    3、代码实现

    /*
    问题描述:
    	给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
    	如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
    	您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
    
    示例:
    	输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
    	输出:7 -> 0 -> 8
    	原因:342 + 465 = 807
    
    解决思路:
    	当给定的两个链表都不为空时,进行加法,添加新节点,并设置进位;
    	当一个表为空,另一表不为空,进行赋值(注意如果前面有进位,需要加1),添加新节点,并设置进位;
    	最后两个表都为空,做检查是否产生进位,如果产生进位,还需要新添加一个新节点。
    */
    
    #include <iostream>
    #include <vector>
    using namespace std;
    
    //定义结构体
    struct ListNode {
    	int val;
    	ListNode *next;
    	ListNode(int x) : val(x), next(NULL) {}	
    };
    
    
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
    	ListNode *Head, *L, *LNew;
    	// 申请头结点
    	Head = new ListNode(0);
    	L = Head;
    	L->next = NULL;	
    
    	//定义一个进位标志符
    	int flag = 0;
    	//定义一个临时求和变量sum
    	int sum = 0;
    	
    	//当l1和l2都不为空时,进行两个链表的加法
    	while (l1 != NULL && l2 != NULL) {
    		LNew = new ListNode(0);
    		//判断前面的数相加是否产生进位
    		if (flag == 1) {
    			sum = l1->val + l2->val + 1;
    			//大于9,需要进位
    			if (sum > 9) {
    				LNew->val = sum - 10;
    				flag = 1;
    			}
    			else
    			{
    				LNew->val = sum;
    				flag = 0;
    			}
    		}
    		else
    		{
    			sum = l1->val + l2->val;
    			//大于9,需要进位
    			if (sum > 9) {
    				LNew->val = sum - 10;
    				flag = 1;
    			}
    			else
    			{
    				LNew->val = sum;
    				flag = 0;
    			}
    		}
    		
    		//插入结点
    		L->next = LNew;
    		LNew->next = NULL;
    		L = L->next;
    
    		l1 = l1->next;
    		l2 = l2->next;		
    	}
    
    	//判断是否还有不为空的List
    	//当l2为空,l1不为空时,进行单链表加法,此时应注意是否有进位
    	while(l1 != NULL) {
    		LNew = new ListNode(0);
    		if (flag == 1) {
    			sum = l1->val + 1;
    			//大于9,需要进位
    			if (sum > 9) {
    				LNew->val = sum - 10;
    				flag = 1;
    			}
    			else
    			{
    				LNew->val = sum;
    				flag = 0;
    			}
    		}
    		else
    		{
    			sum = l1->val;
    			//大于9,需要进位
    			if (sum > 9) {
    				LNew->val = sum - 10;
    				flag = 1;
    			}
    			else
    			{
    				LNew->val = sum;
    				flag = 0;
    			}
    		}
    
    		L->next = LNew;
    		LNew->next = NULL;
    		L = L->next;
    
    		l1 = l1->next;
    	}
    	//当l1为空, l2不为空时,进行单链表加法,此时应注意是否有进位
    	while (l2 != NULL)
    	{ 
    		LNew = new ListNode(0);
    		if (flag == 1) {
    			sum = l2->val + 1;
    			if (sum > 9) {
    				LNew->val = sum - 10;
    				flag = 1;
    			}
    			else
    			{
    				LNew->val = sum;
    				flag = 0;
    			}
    		}
    		else
    		{
    			sum = l2->val;
    			if (sum > 9) {
    				LNew->val = sum - 10;
    				flag = 1;
    			}
    			else
    			{
    				LNew->val = sum;
    				flag = 0;
    			}
    		}
    
    		L->next = LNew;
    		LNew->next = NULL;
    		L = L->next;
    
    		l2 = l2->next;
    	}
    	
    
    	//超过给定两个List长度, 如果还有进位,需要再添加一个结点
    	if (l1 == NULL && l2 == NULL && flag == 1) {
    		LNew = new ListNode(0);
    		LNew->val = 1;
    		L->next = LNew;
    		LNew->next = NULL;
    		L = L->next;
    	}
    
    
    	
    	return Head;
    }
    
    //创建带有头结点的链表
    ListNode* creatList(vector<int> &v) {
    	ListNode *Head, *L, *LNew;
    	// 申请结点
    	Head = new ListNode(0);
    	L = Head;
    	L->next = NULL;
    
    	//创建新结点
    	for (int i = 0; i < v.size(); ++i) {
    		LNew = new ListNode(0);
    		LNew->val = v[i];
    
    		L->next = LNew;
    		LNew->next = NULL;
    		L = L->next;
    	}	
    
    	return Head;
    }
    
    //打印链表
    void printList(ListNode *L) {
    	while (L != NULL) {
    		cout << L->val << ' ';
    		L = L->next;
    	}
    	cout << endl;
    }
    
    
    int main()
    {
    	//创建
    	ListNode *list1, *list2, *list3;
    	vector<int> v1, v2;
    	
    	//v1 = { 2,4,3 };
    	//v2 = { 5,6,4 };
    
    	v1 = { 1, 8 };
    	v2 = { 9 };
    
    
    	list1 = creatList(v1);
    	list1 = list1->next;
    	list2 = creatList(v2);
    	list2 = list2->next;
    	
    	//printList(list1);
    	//printList(list2);
    
    	list3 = addTwoNumbers(list1, list2);
    	list3 = list3->next;
    
    	printList(list3);
    
    	return 0;
    }
    

  • 相关阅读:
    自己去写的一些方法
    pyhon,统计一个字符串,在一个文本里面的个数,写查慢sql时用到的
    为什么调用类方法,老是报缺少位置参数 self
    链接mongodb 使用pymong
    django框架学习+怎么连接mongdb,和普通的mysql
    前端写ajax请求,放在javascript里面
    django之注释,
    django的 render和 返回httpsresponse的区别
    windows系统安装mongodb数据库。
    解决SQL Server Management Studio 18(SSMS)打开闪退的问题
  • 原文地址:https://www.cnblogs.com/komean/p/10899475.html
Copyright © 2011-2022 走看看