Add Two Numbers--Medium

本文介绍了一种解决链表加法问题的方法,通过模拟数学中两数相加的过程,使用链表来表示非负整数,并返回两个链表代表的数字之和。详细解释了算法的实现过程,包括初始化、循环计算每位上的和、处理进位以及返回结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

版权声明:本文为博主原创文章,未经博主允许不得转载。

一、问题描述

  You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.

  You may assume the two numbers do not contain any leading zero, except the number 0 itself.

  意思是将给你两个非空链表代表两个非负整数。并且数字是以倒序存储的,每个节点只包含一个数字。求这两个非负整数的和并以链表的形式返回,可以假设这两个数字没有包含任何前导零,除非这个数字本身就是零。

二、生词

  non-negative adj.非负的

  store  vt. /stɔː/贮藏,储存

  pseudocode  n./'sju:dəʊˌkəʊd/ 伪代码

三、样例及说明

  

  

/**题目预定义好的节点类
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */

 

四、解题思路及代码

  我一开始把ListNode理解为一个容器,竟然用增强for循环去迭代。。。醉辽,所以要看清代码!!!

  本题用模拟数学上两数相加即可解出。

  伪代码:

  1.  初始化一个返回链表的虚拟头
  2.  初始化p,q,curr分别代表两个链表的头节点l1,l2及当前所在的节点
  3.  初始化一个整型变量代表数学中的进位
  4.  一个while循环,功能是算每个位上的和、更新进位和链表
  5.  判断进位的最后状态,如果大于零则更新链表
  6.  最后返回虚拟头的下一个节点,也就是结果链表的根节点
 1 class Solution {
 2     
 3     public ListNode addTwoNumbers(ListNode l1, ListNode l2) { //注意题目要求返回的是一个节点!也就是说只要把链表的根节点返回就好
 4         ListNode head = new ListNode(0);
 5         ListNode p = l1, q = l2, curr = head ;
 6         int carry = 0;
 7         while(p!=null || q!=null) {
 8             int x = p!=null ? p.val : 0;
 9             int y = q!=null ? q.val : 0;
10             int sum = x + y + carry;
11             carry = sum/10 ;
12             curr.next = new ListNode(sum%10) ;
13             curr = curr.next ;
14             if(p!=null) p = p.next;
15             if(q!=null) q = q.next;
16         }
17         if(carry > 0) {
18             curr.next = new ListNode(carry) ;
19         }
20         return head.next; 
21     }
22 }

  以上代码的时间复杂度是O(max(m,n)),m和n分别表示以节点l1、l2为根节点的链表长度。

  

  

  

 

转载于:https://www.cnblogs.com/crush-u-1214/p/10440420.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值