Leetcode002--单链表两数相加


一、原题



  You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list. 
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4) 
Output: 7 -> 0 -> 8 



二、中文



  有两个单链表,代表两个非负数,每一个节点代表一个数位,数字是反向存储的,即第一个结点表示最低位,最后一个结点表示最高位。求两个数的相加和,并且以链表形式返回。



三、举例



输入链表 1->2->3->4 和链表 1->8->3->4 最后得到链表 2->0->7->8



四、思路



(1)构建两链表从最左边开始相加,其结果存入另外一个链表

(2)当相加之和小于10时,不产生进位,当大于等于10的时候,产生进位

(3)这里要注意一种情况,就是当最后的一对结点相加之和大于等于10的时候也要产生进位,这是需要创建一个新的结点



五、程序



package LeetCode;

public class Leetcode002 {
	public static void main(String args[]){
		//测试程序,链表1:1->8->3->6,链表2:1->2->3->4
		ListNode node1 = new ListNode();
		node1.value = 1;  
  
		node1.next = new ListNode();  
		node1.next.value = 8;  
  
		node1.next.next = new ListNode();  
		node1.next.next.value = 3;  
  
		node1.next.next.next = new ListNode();  
		node1.next.next.next.value = 6;  
		
		
		ListNode node2 = new ListNode();
		node2.value = 1;  
  
		node2.next = new ListNode();  
		node2.next.value = 2;  
  
		node2.next.next = new ListNode();  
		node2.next.next.value = 3;  
  
		node2.next.next.next = new ListNode();  
		node2.next.next.next.value = 4;  
		
		ListNode node3 = new ListNode();
		node3 = addTwoLists(node1, node2);
		
		//打印我们返回的链表结果
		while(node3 != null){
			System.out.print(node3);
			node3 = node3.next;
			
		}

	}
	
	//创建一个链表的类
	public static class ListNode{
		int value;
		ListNode next;
		
		public ListNode(){
			
		}
		
		public String toString(){
			return value+"->";
		}
		
	}
	
	public static ListNode addTwoLists(ListNode head1, ListNode head2){
		if(head1 == null || head2 == null){
			return null;
		}
		
		ListNode head3 = new ListNode();
		// 保存头结点,最后返回的时候用
		ListNode storeNode = head3;
		int flag = 0;
		int sum = 0;
		
		while(head1 != null && head2 != null){
			sum = head1.value + head2.value + flag;
			flag = 0;
			if(sum < 10){
				head3.value = sum;
			}
			else if(sum >= 10){
				flag = 1;
				head3.value = sum - 10;
			}			
			head1 = head1.next;
			head2 = head2.next;
			
			//创建一个新的结点,前提是不是到达两个链表最后的元素时
			if(head1 != null && head2 != null){
				ListNode newnode = new ListNode();
				head3.next = newnode;
				head3 = head3.next;
			}
		}
		
		// 如果有一个为空的情况下执行
		if(head1 == null){
			head3.next = head2;
		}
		if(head2 == null){
			head3.next = head1;
		}
		
		// 也就是说最后一位相加还有进位,要创建一个新的结点
		if(flag == 1){
			ListNode lastnode = new ListNode();
			lastnode.value = 1;
			head3.next = lastnode;
		}		
		return storeNode;
	}
}

-------------output---------------


2->0->7->0->1->





你可能感兴趣的:(【LeetCode】)