求两个单链表相加的结果

题目要求是:

两个单链表(singly linked list),每一个节点里面只能存一个0-9的数字,输入就相当于两个大数了,由高位到低位。然后返回这两个数的和(一个新list)。这两个输入的list 长度相等。 要求是:1. 不用递归。2. 要求算法在最好的情况下,只遍历两个list一次,最差的情况下两遍。

Java代码:

public class TwoLinkedPlus {

	/**
	 * @author yyp
	 * @createdate 2014-1-26 下午12:39:41
	 * @Description: (用一句话描述该方法做什么)
	 * @param args
	 * 
	 */
	public static void main(String[] args) {
		Node node1 = new Node(2,new Node(4, new Node(7, null)));
		Node node2 = new Node(7,new Node(5, new Node(6, null)));
		printNode(node1);
		printNode(node2);
		Node node3 = twoLinkedPlus(node1, node2);
		printNode(node3);
	}
	/**
	 * 两个单链表相加
	 * 主要算法是:在返回的相加后的单链表上,记录一个可以用于进位的节点,当需要
	 * 进位时,此节点的值自增。这个进位节点是当前求得节点值之前的第一个值小于9的节点
	 * 比如:
	 *   1 2 3
	 * + 4 5 6
	 * 当计算第二位的相加结果时(即 2 + 5)时,进位节点为结果链表的第一个节点,节点值为5
	 *   3 4 6 7
	 * + 2 5 3 4
	 * 当计算第四位数相加的结果时,进位数节点为结果链表的第一个节点,节点值为5
	 * @author yyp
	 * @createdate 2014-1-26 下午3:03:53
	 * @Description: (用一句话描述该方法做什么)
	 * @param first
	 * @param second
	 * @return
	 *
	 */
	public static Node twoLinkedPlus(Node first, Node second) {
		Node prePlusNode = null;
		Node curPlusNode = null;
		Node resultNode = null;
		int num = 1;
		while(first != null) {
			int retValueTmp = first.value + second.value;
			//如果第一位数要进位
			if(retValueTmp >= 10 && num == 1){
				resultNode = new Node(1, null);
				resultNode.next  = new Node(retValueTmp - 10, null);
				prePlusNode = resultNode.next;
				curPlusNode = resultNode.next;
			//不是第一位的其他位数进位
			}else if(retValueTmp >= 10){
				//当前用于进位的数自增
				prePlusNode.value++;
				curPlusNode.next = new Node(retValueTmp - 10, null);
				//当需要累积进位时,将用于进位的数和当前操作数的值设为0
				while(prePlusNode != curPlusNode){
					prePlusNode.next.value = 0;
					prePlusNode = prePlusNode.next;
				}
				//重新设置用于进位的数和当前操作的数
				prePlusNode = curPlusNode;
				curPlusNode = curPlusNode.next;
			}else{
				if(curPlusNode == null){
					//初始化
					resultNode = new Node(retValueTmp, null);
					curPlusNode = resultNode;
					prePlusNode = resultNode;
				}else{
					curPlusNode.next = new Node(retValueTmp, null);
					if(retValueTmp < 9){
						prePlusNode =curPlusNode.next;
					}
					curPlusNode = curPlusNode.next;
				}
			}
			first = first.next;
			second = second.next;
			num ++;
		}
		return resultNode;
	}
	/**
	 * 输出单链表代表的数
	 * @author yyp
	 * @createdate 2014-1-26 下午3:03:26
	 * @Description: (用一句话描述该方法做什么)
	 * @param node
	 *
	 */
	public static void printNode(Node node){
		while(node != null){
			System.out.print(node.value);
			node = node.next;
		}
		System.out.println();
	}

}
/**
 * 节点类,限制value的值只能为0~9的数字
 * @author yyp
 * @createdate 2014-1-26 下午3:02:41
 * @Description: TODO(用一句话描述该类做什么)
 */
class Node{
	protected int value;
	protected Node next;
	public Node() {}
	public Node(int value, Node next) {
		if(value < 0 || value > 9){
			throw new RuntimeException("parameter erroe!");
		}
		this.value = value;
		this.next = next;
	}
}


 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值