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

对于这个问题还有一个很好的方法:

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;
        }

    }

    public  Node addLists2(Node head1, Node head2){
        head1 = reverseList(head1);
        head2 = reverseList(head2);

        int ca = 0;
        int n1 =0;
        int n2 =0;
        int n =0;

        Node c1 = head1;
        Node c2 = head2;
        Node node = null;
        Node pre = null;

        while(c1 !=null || c2!=null){
            n1 = c1 != null ? c1.value:0;
            n2 = c2 != null ? c2.value:0;
            n = n1+n2+ca;
            pre= node;
            node = new Node(n % 10);
            node.next=pre;
            ca=n/10;
            c1=c1 != null ? c1.next : null;
            c2=c2 != null ? c2.next : null;
        }
        if(ca == 1){
            pre=node;
            node = new Node(1);
            node.next = pre;
        }
        reverseList(head1);
        reverseList(head2);
        return node;
    }
       public  static  Node reverseList(Node head){
            Node pre = null;
            Node next = null;
            while(head!=null){
                next=head.next;
                head.next=pre;
                pre=head;
                head=next;
            }
            return pre;
       }

}
时间: 2024-10-16 06:09:59

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

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

假设链表中每一个节点的值都在0~9之间,那么链表整体就可以代表一个整数 给定两个链表的头节点head1和head2,请生成代表两个整数相加值的结果链表 传统做法 先把链表生成 整数 然后相加  这样的有个溢出问题 介绍一种做法: 利用栈结构求解: 1. 将两个链表分别从左到右遍历,遍历过程中将值压栈,这样就生成了两个链表节点的逆序栈s1 和 s2. 2.将s1和s2同步弹出,这样相当于两个链表从低位到高位一次弹出,在这个过程中生成相加链表即可,同时关注下是否有进位. 当s1 和 s2都为空时,还

【算法导论学习-23】两个单链表(single linked)求交点

问题:A.B两个单链表如果有交点,返回第一个交点在A中的位置(链表头结点位置为0). 分析:A.B如果有交点,交点的后继一定也是交点,所以一定是Y型相交,所以算法的思想如下 1)  求得A.B的长度,比如ALength,Blength 2)  判断ALength,Blength谁大,比如Alength>Blength 3)  Alength移动到Alength-Blength的位置,开始判断每个节点是否相等,相等则退出. 以本博客中"[算法导论学习-20]单链表(single linked

数据结构与算法系列(1)-单链表类的实现(C++)

通过定义一个C++类封装单链表这种数据结构, 封装的方法有: 1.通过输入创建单链表: 2.获取单链表的数据元素个数: 3.打印输出单链表中各个元素: 4.搜索某个元素在单链表中的位置: 5.在某个位置之后插入一个结点: 6.在某个位置删除一个节点: 7.单链表逆置: 8.单链表是否存在回环的判定: 9.单链表的升序排序: 10.两个单链表的升序合并: 11.两个单链表的降序合并. 注:单链表的排序采用的是快速排序的方法. 下面是C++写的程序代码,附运行截图. #include <iostre

数据结构和算法设计专题之---判断单链表中是否有环,环的长度,环的入口节点

题目: 给定一个单链表,只给出头指针head: 1.如何判断是否存在环? 2.如何知道环的长度? 3.如何找出环的连接点在哪里? 4.带环链表的长度是多少? 解法: 1.对于问题1,使用追赶的方法,设定两个指针slow.fast,从头指针开始,每次分别前进1步.2步.如存在环,则两者相遇:如不存在环,fast遇到NULL退出. 2.对于问题2,记录下问题1的碰撞点p,slow.fast从该点开始,再次碰撞所走过的操作数就是环的长度s. 3.问题3:有定理:碰撞点p到连接点的距离=头指针到连接点的

Java-找出两个单链表的首个公共节点

单链表中的简单算法 /** * 得到两个单链表的公共结点 * 先求出两个链表的长度,并求出二者的差值dif,两个指针分别指向链表头部,让指向长的链表的指针先向链表尾部移动dif步. * 最后一起一步步移动两个指针,当两个指针都指向同一个结点时,返回那个结点 * @param list1 * @param list2 * @return */ public static ListNode getFirstCommonNode(ListNode list1,ListNode list2){ if(l

单链表 --- 合并两个单链表

合并单链表 --> 一.解决方法: 确保两个单链表不为空,且二者皆有序(若无序,则先进行排序) 创建新的单链表,并比较原本两个单链表数据大小,较小者置于新单链表中 逐步将两个单链表的数据置于新单链表中,直至二者为空 二.程序代码: ListNode* MergeList(ListNode *L1,ListNode *L2)//合并两个单链表 { ListNode *newHead=NULL; ListNode *tail=NULL; if(L1==NULL) { return L2; } if(

7_2判断两个单链表是否相交,若相交,求出第一个交点

转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4251372.html 声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己也方便有类似问题的朋友,本文的思想也许有所借鉴,但源码均为本人实现,如有侵权,请发邮件表明文章和原出处地址,我一定在文章中注明.谢谢. 题目:7_2判断两个单链表是否相交,若相交,求出第一个交点. 题目分析: 创建A,B两个单链表,将B的尾部指向头部,若两个单链表相交,则交点必为环的入口,这就又变成

判断两个单链表是否相交及相交的第一个节点

/* 问题: 1.判断两个单链表是否相交 2.找出第一个相交节点 解题思路: 1.若连个链表相交则从相交节点开始以后节点都是一样的 2.通过链表长度判断然后去寻找 */ #include<stdlib.h> #include<stdio.h> /* 创建节点 */ typedef struct STU { char a; struct STU *next; }*SListNode; SListNode ListA; SListNode ListB; /* 创建链表A */ SLis

算法题——二叉树转换为左单链表

题目:给定一棵二叉树,将所有的结点都放到左儿子的位置,即除了root结点外,每一个结点都是其他某一个结点的左儿子.不用保持某种顺序,不能递归,O(1)空间. 思路: 我的想法是,维持一个遍历指针p,另一个指针tail永远指向向左遍历到底的结点: 初始化p和tail都为root,开始循环: 如果p为叶子结点,则退出循环: 如果p没有右儿子,则向左下降一层: 如果p有右儿子,则tail向左遍历到底,将p的右子树挂到tail的左儿子上,p右儿子赋空值,然后向左下降一层. p每次下降一层时,tail从上