我的java面试编程题——记录每一天(19.4.10.3)

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


显示结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值