链表练习——两数求和

先看题目:

  

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 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]

 题目分析:

(1)链表中的数字是逆序存储的

比如321,他的链表结构是 1  ——>  2 ——>  3。456,他的链表结构是 6 ——> 5 ——> 4。

在计算时我们遍历两个链表的第一位是数字的个位:

  首先我们要返回一个链表,先定义一个头节点,用来初始化链表,定义一个进制位变量用来存储需要进位的数字(要在遍历两条链表之前定义,因为两个链表的最后一个节点之和要进位时需要在建立一个尾节点)。然后遍历两个链表,首先我们先思考一下两条链表怎么相加,就是每一个节点的val值相加,前提是个十百千....位都要对齐做运算。如果一个数是321,另一个数是12,那么运算过程是

1 + 1, 2 + 2, 3 + 0。所以我们是要遍历完两个链表的,虽然链表的长度可能不一致,但是当一条链表长度不够(也就是节点为null),我们需要将这个节点的val设为 0。

  上代码,这种简单过程就不写注释了。

复制代码
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
       
       ListNode pre = new ListNode();
        ListNode cur = pre;
        int jinwei = 0;
        while(l1 != null || l2 != null)
        {
           int val1 = l1 == null ? 0 : l1.val;
           int val2 = l2 == null ? 0 : l2.val;

           int sum = val1 + val2  + jinwei;
           jinwei = sum / 10;
           sum = sum % 10;

           cur.next = new ListNode(sum);
            cur = cur.next;
           if(l1 != null)
           l1 = l1.next;
           if(l2 != null)
            l2 = l2.next;
        }

        if(jinwei == 1){
            cur.next = new ListNode(jinwei);
        }
        return pre.next;
    }
}
复制代码

 

posted @   几人著眼到青衫  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示