LeetCode02-链表中的两数之和

在这里插入图片描述


public class DemoApplicationTests {

	@Test
	public void contextLoads() {
		 ListNode l1 = new ListNode(2);
        ListNode l1_2 = new ListNode(4);
        ListNode l1_3 = new ListNode(3);
        l1.next=l1_2;
        l1_2.next=l1_3;
        ListNode l2 = new ListNode(5);
        ListNode l2_2 = new ListNode(6);
        ListNode l2_3 = new ListNode(4);
        l2.next=l2_2;
        l2_2.next=l2_3;
        addTwoNumbers(l1,l2);
	}
	/**
     * 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
     * 输出:7 -> 0 -> 8
     * 原因:342 + 465 = 807
     * @param l1
     * @param l2
     * @return
     */
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        //第一步 先新建一个结果链表、当前链表、进位
        ListNode result=new ListNode(0);
        ListNode cur=result;
        int i=0;
        while (l1!=null||l2!=null){
        	//避免链表长度不一致
            if(l1==null)l1.val=0;
            if(l2==null)l2.val=0;
            //计算当前节点的和
            int num=i+l1.val+l2.val+i;
            //赋值进位
            i=num/10;
            //1.cur:0->7  result:0->7    2. cur:7->0 result:0->7->0  3. cur:0->8 result:0->7->0->8
            cur.next=new ListNode((num)%10);添加结点
            //1.cur:7   result:0->7   2. cur:0 result:0->7->0  3. cur:8 result:0->7->0->8
            cur=cur.next;//移动节点
            if(l1!=null)l1=l1.next;
            if(l2!=null)l2=l2.next;
        }
        //如果最后有进位则结果指向新的节点node
        if (i > 0) {
            result.next = new ListNode(i);
        }
        return result.next;
    }
   
}

    /**
     * 一直疑惑的问题是明明cur=result 他们的都应该引用一个地址,为什么cur在发生改变的时候,result不发生改变呢?
     * 第一次进入while循环的时候 假设rusult和cur的r地址都是@0001
     * 在cur.next被赋值的时候,rusult和cur的r地址都是@0001 但是cur.next这个节点的地址是@0002
     * 所以cur=cur.next的时候 rusult地址是@0001   rusult.next,cur和cur.next地址为@0002
     * 所以在下层循环时 因为cur和rusult.next的地址相同,所以在给cur.next赋值的时候,rusult.next.next也会呗赋值
     */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值