//日期:19.4.10
//作者:***
//功能:java面试编程题目练习三
//=========================================================
//问题描述:给定两个整数链表,节点内容有却仅有一个单位的数字,然后对两个链表对应
//位置的数值进行相加,定义一个规则:当和大于等于10的时候,向下一个节点的结果进位1
//例如:{7,5,2}+{8,6,7}={5,2,0,1}
//========================================================
//思路方法:很简单的一个题目,直接操作处理即可,
//唯一需要注意一下的就是这个进位,特别是最后一个节点的进位
package com.**********;
import java.util.*;
public class Practice3 {
//主函数,程序测试入口
public static void main(String args[])
{
Practice3 pp=new Practice3();
pp.run();
}
//封装执行操作的函数
public void run()
{
//默认创建与题目相同的两个链表
//创建第一个链表
ListNode head1=new ListNode(0); //使用链表的头指针
ListNode ln1_1=new ListNode(7); //第一个节点
ListNode ln1_2=new ListNode(5); //第二个节点
ListNode ln1_3=new ListNode(2); //第三个节点
head1.next=ln1_1;
ln1_1.next=ln1_2;
ln1_2.next=ln1_3;
//创建第一个链表
ListNode head2=new ListNode(0); //使用链表的头指针
ListNode ln2_1=new ListNode(8); //第一个节点
ListNode ln2_2=new ListNode(6); //第二个节点
ListNode ln2_3=new ListNode(7); //第三个节点
head2.next=ln2_1;
ln2_1.next=ln2_2;
ln2_2.next=ln2_3;
ListNode result=this.addList(head1, head2); //调用进行操作的函数
//可以遍历显示结果
ListNode node=result.next;
while(node != null)
{
System.out.println(node.getValue());
node=node.next;
}
}
//封装执行题目操作的函数,参数传递进来两个进行操作链表的头指针
public ListNode addList(ListNode head1,ListNode head2)
{
ListNode ln1=head1.next;
ListNode ln2=head2.next; //复制两个指针,使用复制后的引用操作,避免破坏原链的引用
int sum=0; //使用int变量保存计算结果
ListNode resultHead=new ListNode(0); //使用新的引用,获得结果链表
ListNode resHeadCopy=resultHead; //复制一个头指针,去实际移动操作,这样是为了保持一个原头指针不变
//进行实际操作的过程,使用循环遍历两个链表
while(ln1 != null || ln2 != null)
{
if(ln1 != null)
{
sum+=ln1.getValue(); //处理第一个链表的节点,加到结果中
ln1=ln1.next; //链表向下一个节点移动
}
if(ln2 != null)
{
sum+=ln2.getValue(); //处理第二个链表的节点,加到结果中
ln2=ln2.next; //链表向下一个节点移动
}
//本题目的核心在于下面对于sum的取模和取余操作
resHeadCopy.next=new ListNode( sum%10 ); //对10取余是当前位置取和保留的最终数值
resHeadCopy=resHeadCopy.next; //注意移动操作指针的位置
sum/=10; //对10取模是保留进位,用于下一次循环(当然如果不进位就是0)
}
//由于最后一个对应位置节点相加后,如果发生进位,则结果链表还需要一个节点
//在此进行处理,特殊处理最后一个的特殊位置
//此处的思路很明确,就是循环结束后,发现sum不为0,则表示最后一次取和发生了进位
if(sum == 1)
{
resHeadCopy.next=new ListNode(sum);
}
return resultHead; //这里就表现出为什么需要一个头指针的副本,是为了保证有一个头指针,始终作为链表的入口,不可改变
}
}
//====================================================
//创建节点类ListNode
class ListNode
{
private int value=0; //定义唯一的值域int
public ListNode next=null; //链表中指向下一个节点的指针
//构造函数初始化赋值
public ListNode(int value)
{
this.value=value; //使用传入的参数给int域值初始化赋值
}
//封装的private的get和set方法
public int getValue()
{
return value;
}
public void setValue(int value)
{
this.value = value;
}
}
显示结果如下:

本文介绍了一种解决两个整数链表相加问题的方法,通过遍历链表并处理进位,实现了链表数值的加法运算。文章详细解释了代码逻辑,包括节点创建、链表遍历和结果输出。

被折叠的 条评论
为什么被折叠?



