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

    给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

    如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

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

    示例:

    输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
    输出:7 -> 0 -> 8
    原因:342 + 465 = 807


    思路:两个链表不为空时,同一位置对应相加,若和大于10,则标记flag=1,下一位需要进位+1,重置flag=0;循环一直到某个链表为空,再判断剩下链表的情况即可。
    #pragma once
    
    
    struct ListNode {
    	int val;
    	ListNode *next;
    	ListNode(int x) : val(x), next(nullptr) {}
    };
    
    
    /*
    
    执行用时 : 68 ms, 在Add Two Numbers的C++提交中击败了3.43% 的用户
    内存消耗 : 19.1 MB, 在Add Two Numbers的C++提交中击败了0.94% 的用户
    */
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)
    {
    	ListNode *newHead = new ListNode(0);
    	ListNode *ptr = newHead;
    	int flag = 0;
    	while (l1 != nullptr && l2 != nullptr)
    	{
    		ListNode* temp = new ListNode(0);
    		ptr->next = temp;
    		ptr = temp;
    		int sum = l1->val + l2->val;
    		if (flag == 1)
    		{
    			sum += 1;
    			flag = 0;
    		}
    		if (sum >= 10)
    		{
    			sum = sum - 10;
    			flag = 1;
    		}
    		ptr->val = sum;
    		l1 = l1->next;
    		l2 = l2->next;
    	}
    	if (flag == 1 && l1 == nullptr && l2 == nullptr)
    	{
    		ListNode *tail = new ListNode(1);
    		ptr->next = tail;
    	}
    	if (l1 != nullptr)
    	{
    		ListNode* tempL1 = l1;
    		while (flag)
    		{
    			int sum = l1->val + 1;
    			if (sum < 10)
    			{
    				l1->val = sum;
    				break;
    			}
    			l1->val = sum - 10;
    			if (l1->next == nullptr)
    			{
    				ListNode* tail = new ListNode(1);
    				l1->next = tail;
    				break;
    			}
    			else
    				l1 = l1->next;
    		}
    		ptr->next = tempL1;
    	}
    
    	if (l2 != nullptr)
    	{
    		ListNode *tempL2 = l2;
    		while (flag)
    		{
    			int sum = l2->val + 1;
    			if (sum < 10)
    			{
    				l2->val = sum;
    				break;
    			}
    			l2->val = sum - 10;
    			if (l2->next == nullptr)
    			{
    				ListNode* tail = new ListNode(1);
    				l2->next = tail;
    				break;
    			}
    			else
    				l2 = l2->next;
    		}
    		ptr->next = tempL2;
    	}
    	return newHead->next;
    }
    

      

  • 相关阅读:
    Linux命令行和Shell脚本编程
    Excel自动触发时间
    dom4j读取xml文件 简单例子
    GSM & Foxit Reader
    ThreadPoolExecutor 线程池
    Linux /var/log
    delphi开发技巧
    利用ScktSrvr打造多功能Socket服务器
    delphi中Windows消息大全使用详解
    自己构造注入点方便入侵
  • 原文地址:https://www.cnblogs.com/cyhezt/p/10504225.html
Copyright © 2011-2022 走看看