两数相加

博客核心内容为两数相加,虽未展开详细信息,但明确提及此关键操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

两数相加

/*
    给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。

示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
*/
            @Test
	    public void main() {
		// 创建两个链表
                // 第一个链表:  1-> 8 -> 7 -> 6  (在做加法运算代表的是6781)
                ListNode l1 = new ListNode(1);  // 这是第一个链表的第一个节点(不能用这个节点去往下加数据)
                // 必须有一个指针去往第一个节点上去加数据
                ListNode p = l1;  // 这个指针节点会从链表的第一个节点一直往下走(直至最后一个节点)
                p.next = new ListNode(8);
                p = p.next;
                p.next = new ListNode(7);
                p = p.next;
                p.next = new ListNode(6);

                // 第二个链表
                ListNode l2 = new ListNode(9);
                ListNode q = l2;
                q.next = new ListNode(9);
                q = q.next;
                q.next = new ListNode(9);
                q = q.next;
                q.next = new ListNode(9);

                ListNode re = addTwoNumbers(l1, l2);
                while(re != null) {
                    System.out.println(re.val);
                    re = re.next;
                }

	    }

	        //方案一
	        public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
		ListNode c1 = l1;
                ListNode c2 = l2;
                ListNode sentinel = new ListNode(0);	//初始化一个0开头的链表节点,存储返回结果
                ListNode d = sentinel;	//处理临时值
                int sum = 0;	//进位和当前位
                while (c1 != null || c2 != null) {	//遍历两个链表
                    sum /= 10;	//进位值
                    if (c1 != null) {	//c1有下一个值
                        sum += c1.val;
                        c1 = c1.next;
                    }
                    if (c2 != null) {	//c2有下一个值
                        sum += c2.val;
                        c2 = c2.next;
                    }
                    d.next = new ListNode(sum % 10);	//当前位值
                    d = d.next;		//存出结果的下一个节点
                }
                if (sum / 10 == 1)
                    d.next = new ListNode(1);
                return sentinel.next;
	    }

	    //方案二
	    public ListNode addTwoNumber2(ListNode l1, ListNode l2) {
            ListNode dumyHead = new ListNode(0);
            ListNode p = l1, q = l2, curr = dumyHead;
            int carry = 0;  // 表示是否需要进位(只有连个值:0跟1)
            while(p != null || q != null) {
                int x = (p != null ) ? p.val : 0; // 需要考虑位数不同的数字相加
                int y = (q != null ) ? q.val : 0;
                int sum = carry + x + y;
                carry = sum / 10;  // 进位携带
                curr.next = new ListNode(sum % 10);
                curr = curr.next;
                if(p != null ) p = p.next;
                if(q != null ) q = q.next;
            }
            // 加到最后一位
            if(carry > 0) {
                curr.next = new ListNode(carry);
            }

            return dumyHead.next;
        }
	
	public class ListNode {
		int val;
		ListNode next;

		ListNode(int x) {
			val = x;
		}
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值