LeetCode2_两数相加

这篇博客分享了在LeetCode上解决链表相加问题的过程和理解,包括初始思路的错误——误以为需要反转链表。作者通过解析题意,实现了正确的链表相加算法,并探讨了错误的链表连接方式。此外,还介绍了如何反转单链表的技巧。作者意识到自己的算法能力有待提高,并决定继续努力学习,以应对面试挑战。
摘要由CSDN通过智能技术生成

1 题目

leetCode
虽然题目说了一大堆,但事实上执行的就是对链表上的数从左到右逐位相加,一开始理解错题意还以为要将链表反转之后再次相加,看了题解才发现是我想多了。

2 解

    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode head=null;
        ListNode cur=null;
        int carry=0;
        int sum=0;
        while(l1!=null || l2!=null){
            //如果l1不为空则取他的值,为空则补零,l2同理
            int a= l1!=null?l1.val : 0;
            int b= l2!=null?l2.val : 0;

            sum= a+b+carry;
            carry= sum>=10 ? 1 : 0;
            sum=sum%10;
            if(head == null){
                cur = new ListNode(sum);
                head=cur;
            }else{
                cur.next = new ListNode(sum);
                cur=cur.next;
            }
            if(l1!=null)
                l1=l1.next;
            if(l2!=null)
                l2=l2.next;

        }
        //为什么直接写 cur而不用判断是不是head?因为只有之前有数相加才会有进位,
        //所以直接改cur就可以了,head必不为空
        if(carry==1)
            cur.next=new ListNode(1);

        return head;

    }

3 收获

3.1 错误的链表连接

一开始我的结果链表是这样子的,看起来也挺有道理,无head则创建head,把head指向cur,有head则创建cur并移动cur,但是这样子是错误的,为什么呢?因为 cur一开始指向空,相当于将head的next指向空,而cur在创建的时候直接指向了新的ListNode,这代码执行到最后就是内存中一堆节点,但是全都没有连接起来。

            if(head == null){
            	head=new ListNode(sum);
            	head.next=cur;
            }else{
            	cur=new ListNode(sum);
            	cur=cur.next;
            }

3.2 反转链表

前面提到了反转,这里就记录一下如何反转单链表吧,当链表为空时返回空,只有一个节点时返回自身,单链表的逆序需要维护三个指针,指向当前节点的cur,指向前一节点的pre,指向下一节点的next,每次都是将cur的next指向pre,然后pre指向cur,cur指向next,next指向next.next,当next为空时说明到达了链表结尾,此时将cur的next指向pre,就完成整个链表的逆序。
反转链表在牛客上的链接

    public ListNode ReverseList(ListNode head) {
		if(head==null)
			return null;
		if(head.next==null) {
			return head;
		}
		//上面两个if可以合并  if(head == null || head.next == null) return head;
		ListNode pre=null;
		ListNode cur=head;
		ListNode next=head.next;
		while(next!=null) {
			cur.next=pre;
			pre=cur;
			cur=next;
			next=next.next;
		}
		cur.next=pre;
		return cur;
    }

九月中旬终于开始投递,九月末做了一些笔试,觉得自己的算法还需加强,国庆学习了左神算法,台式没带回去所以笔记在本子上,国庆回来被笔试打自闭了几天,但是一直自闭也不是个事,都不容易,坚持就是胜利。

根据提供的引用内容,Leetcode 2 "两数相加"是一个涉及链表的问题。该问题给定了两个非负整数,每个整数的每一位都是按照逆序的方式存储在链表中。我们需要将这两个链表相加,并返回一个新的链表作为结果。 具体解题思路可以使用迭代法或递归法来解决。迭代法的伪代码如下所示: ``` 初始化一个哑节点 dummy 和一个进位 carry,同时把两个链表的头节点分别赋值给 p 和 q 遍历链表,直到 p 和 q 都为 None 计算当前的和 sum 为 p.val + q.val + carry 计算当前的进位 carry 为 sum // 10 创建一个新节点 node,节点的值为 sum % 10 把新节点连接到结果链表的尾部 更新 p 和 q 分别为 p.next 和 q.next 如果最后还有进位 carry,则创建一个新节点 node,节点的值为 carry,并连接到结果链表的尾部 返回结果链表的头节点 dummy.next ``` 递归法的伪代码如下所示: ``` 定义一个辅助函数 addTwoNumbersHelper,输入为两个链表的头节点 p 和 q,以及进位 carry 如果 p 和 q 都为 None 且 进位 carry 为 0,则返回 None 计算当前的和 sum 为 p.val + q.val + carry 计算当前的进位 carry 为 sum // 10 创建一个新节点 node,节点的值为 sum % 10 设置新节点的下一个节点为递归调用 addTwoNumbersHelper(p.next, q.next, carry) 返回新节点 返回 addTwoNumbersHelper(p, q, 0) 的结果 以上是解决 Leetcode 2 "两数相加"问题的两种方法。如果你还有其他相关问题,请
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值