链表问题10——两个单链表生成相加链表(方法二)

题目

假设链表中每一个节点的值都在0-9之间,链表整体代表一个整数。

给定两个这种链表的头节点,请生成代表两个整数相加值的结果链表。

链表1链表2生成的新链表
9->3->76->31->0->0->0

思路 

有一种实现方式是先分别算出两个链表所代表的整数,然后求出两个整数的和,最后将这个和转换成链表的形式。但是这种方法有一个很大的问题,链表的长度可以很长,表达一个很大的整数。因此转换成int类型时可能溢出,所有不推荐此方法。

方法一可以参考我的前一篇文章。

方法二:利用栈的逆序求解,可以节省用栈的空间。

  1. 分别将两个链表逆序。
  2. 同步遍历逆序后的两个链表,在这个过程中生成相加链表即可,同时需要关注每一步是否有进位,用ca表示。
  3. 当两个链表遍历完后,还要关注进位信息是否为1,如果为1,还要生成一个节点值为1的新节点。
  4. 将两个逆序链表再逆序一次,即调整为原来的样子
  5. 返回新生成的结果链表。

源码

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

public Node addList2(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?0:c1.value;
		n2=c2==null?0:c2.value;
		pre=node;
		n=n1+n2+ca;
		node=new Node(n%10);
		node.next=pre;
		c1=c1!=null?c1.next:null;
		c2=c2!=null?c2.next:null;
		ca=n/10;
	}
	if(ca==1){
		pre=node;
		node=new Node(1);
		node.next=pre;
	}
	reverseList(head1);
	reverseList(head2);
	return node;
}

public Node reverseList(Node head){
	Node pre=null;
	Node cur=head;
	Node next=head;
	while(cur!=null){
		next=cur.next;
		cur.next=pre;
		pre=cur;
		cur=next;
	}
	return pre;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值