算法总结之 两个链表生成相加链表

假设链表中每一个节点的值都在0~9之间,那么链表整体就可以代表一个整数

给定两个链表的头节点head1和head2,请生成代表两个整数相加值的结果链表

传统做法 先把链表生成 整数 然后相加  这样的有个溢出问题

介绍一种做法:

利用栈结构求解:

1、 将两个链表分别从左到右遍历,遍历过程中将值压栈,这样就生成了两个链表节点的逆序栈s1 和 s2。

2、将s1和s2同步弹出,这样相当于两个链表从低位到高位一次弹出,在这个过程中生成相加链表即可,同时关注下是否有进位。

当s1 和 s2都为空时,还要关注一下进位信息是否为1,如果为1 还要生成一个节点值为1的新节点

最后返回新生成的结果链表即可

具体请看代码,一目了然:

package TT;

import java.util.Stack;

public class Test97 {

    public  class Node{

        public int value;
        public Node next;

        public Node(int data){
            this.value=data;
        }

    }

    public Node addLists1(Node head1 ,Node head2){

        Stack<Integer> s1= new Stack<Integer>();
        Stack<Integer> s2 =new Stack<Integer>();
        while(head1!= null){
            s1.push(head1.value);
            head1=head1.next;
        }
        while(head1!=null){
            s2.push(head2.value);
            head2=head2.next;
        }

        int ca=0;
        int n1=0;
        int n2=0;
        int n=0;
        Node node = null;
        Node pre = null;

        while(!s1.isEmpty() || !s2.isEmpty()){

            n1 = s1.isEmpty() ? 0:s1.pop();
            n2 = s2.isEmpty() ? 0 :s2.pop();

            n=n1+n2+ca;
            pre=node;

            node=new Node(n%10);
            node.next=pre;
            ca=n/10;

        }

        if(ca==1){
            pre=node;
            node=new Node(1);
            node.next=pre;
        }

        return node;

    }

}
时间: 2024-09-29 18:10:06

算法总结之 两个链表生成相加链表的相关文章

算法总结之 两个单链表生成相加的链表

对于这个问题还有一个很好的方法: 1.将两个链表逆序,这样就可以依次得到从低到高位的数字 2.同步遍历两个逆序后链表,相加生成新链表,同时关注进位 3.当两个链表都遍历完成后,关注进位. 4. 将两个逆序的链表再逆序一遍,调整回去 返回结果链表 package TT; public class Test98 { public class Node{ public int value; public Node next; public Node(int data){ this.value=data

链表的基本操作(元素删除,插入,链表生成,链表倒置)

#include<stdio.h> #include<string.h> #include<stdlib.h> typedef struct stu{ int d; struct stu *l; }st; void xj(st *h)//生成单链表 { st *l; l=h; int m; scanf("%d",&m); h=(st *)malloc(sizeof(st)); while(m--) { st *s; s=new st; sca

LeetCode:Add Two Numbers - 两个链表逐项做带进位的加法生成新链表

1.题目名称 Add Two Numbers (两个链表逐项做带进位的加法生成新链表) 2.题目地址 https://leetcode.com/problems/add-two-numbers/ 3.题目内容 英文:You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a

0~9十个数,每个数只能使用一次,组成两个三位数相加和为四位数的算法

这几天上网,看到百度里面有人问这一道题目,0~9十个数,组成如下加法式 *** + *** = ****,每个数字都只能使用一次,问一共多少中组合? 今天,就用C#语言来写一下,解出这道题,其他语言算法相同,只是语法不同,这里由于时间关系,不再贴出代码. 这里先讲解一下思路,首先我们是程序员,不是数学家,我们是站在编程的角度思考问题.这里是两个三位数相加,得到一个四位数,所有数字不能重复,那么最小的三位数是123,最大的三位数是987,确定循环的范围,当然你非要用100到999也可以,不过就是效

算法题——合并两条有序的链表

题目:给定两个已排序的链表,返回合并后的链表. 思路:将链表L2的每个结点插入到链表L1中,时间复杂度为O(m+n),m.n分别为两条链表的长度. 代码: 1 struct ListNode 2 { 3 int value; 4 ListNode *next; 5 ListNode(int v): value(v), next(NULL) 6 { 7 } 8 }; 9 10 ListNode *mergeSortedList(ListNode *L1, ListNode *L2) 11 { 12

Java之两个链表数字相加

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

两数相加[链表加法] LeetCode.2

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

经典算法学习——合并两个有序链表

类似的,合并两个有序的数组或者链表也是剑指Offer中的经典题型.题目描述如下:输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是按照递增排序的.我这里以合并链表来实现. 在这里,并不需要去创建一个新的链表,只要有三个节点指针就行,第一个节点指针Node1指向第一个链表,第二个节点指针Node2指向第二个链表,第三个节点指针Node3指向新的链表.简单的示意图如下: 当下一个节点在第一个链表中时,Node3指向该节点,Node1++,以此类推.直到某一个链表为空时,把另一个链表全部接

C++算法之 合并两个有序链表

题目:合并两个已经排序好的链表 方法1: 两个链表 比如链表1: 1->3->5->7->9 链表2:  2->4->6->8->10 跟我们合并两个数组一样,链表1的头结点  和链表2的头节点比较,如果链表1头节点的值大于链表2头接点的值, 那么链表2的头结点为合并链表的头结点,那么链表1的头节点继续和链表2的第二个节点(剩余链表2的头结点) 作比较,但一个链表遍历完之后,如果另外一个链表还没有遍历完,因为链表本来就是排序的,所以让合并链表的 尾巴节点指向