02两数相加

这道题还是语法不熟练的问题
其实思路差不多
第一次代码是这样的


class Solution {

    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {

        int i=1,j=1;

        while(l1.next!=null)

        i++;

        while(l2.next!=null)

        j++;

        int nums1=new int[] i;

        int nums2=new int[] j;

        for(i=0;i<nums.length;i++)

        {

            if()

            nums1[i]=l1

        }

    }

}

这里学到一个新东西叫做哨兵节点

哨兵节点

在数据结构和算法中,哨兵节点(Sentinel Node) 是一个特殊的节点,它不是数据集合的一部分,但被添加到数据结构中以简化算法的实现。哨兵节点通常用于链表和散列表等数据结构中。

哨兵节点的作用:

  1. 简化边界条件处理
    使用哨兵节点可以避免在算法实现中对边界条件的检查,因为哨兵节点充当了“占位符”,使得一些操作(如插入和删除)不需要特殊处理空链表的情况。

  2. 提供默认值
    哨兵节点可以存储一个默认值,当数据结构为空时,可以返回这个默认值,而不是返回 null

  3. 实现循环链表
    在循环链表中,哨兵节点可以作为起点,使得遍历操作更加简单。

  4. 避免空指针异常
    在某些情况下,使用哨兵节点可以避免空指针异常,因为即使数据结构为空,哨兵节点仍然存在。

示例:

在您提供的代码 ListNode dummyhead = new ListNode(); 中,dummyhead 是一个哨兵节点,它是一个链表的头节点,但不一定存储实际的数据。在链表操作中,哨兵节点 dummyhead 可以提供以下便利:

  • 虚拟头节点:在链表的头部添加一个不存储实际数据的节点,使得对链表头部的插入和删除操作可以统一处理,而不需要单独编写特殊情况的代码。
  • 简化迭代器:在遍历链表时,哨兵节点可以作为迭代的起始点,简化迭代器的逻辑。

例如,在双向链表中,哨兵节点可以很容易地连接到头节点和尾节点,使得对链表的头部和尾部的操作更加直观和方便。

代码示例:

class ListNode {
    int val;
    ListNode next;

    ListNode() {}

    ListNode(int val) {
        this.val = val;
    }
}

public class LinkedList {
    private ListNode dummyhead;

    public LinkedList() {
        this.dummyhead = new ListNode();
    }

    // 示例:在链表头部插入一个新节点
    public void insertAtHead(int val) {
        ListNode newNode = new ListNode(val);
        newNode.next = dummyhead.next;
        dummyhead.next = newNode;
    }

    // 示例:删除链表头部的节点
    public int deleteFromHead() {
        if (dummyhead.next == null) {
            return -1; // 或者抛出异常
        }
        int val = dummyhead.next.val;
        dummyhead.next = dummyhead.next.next;
        return val;
    }
}

在这个例子中,dummyhead 是一个哨兵节点,它简化了链表头部的插入和删除操作。通过哨兵节点,我们不需要对空链表进行特殊处理,因为哨兵节点始终存在。

继续

class Solution {

    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {

        ListNode dummyhead = new ListNode(0);

        ListNode p=l1,q=l2,curry=dummyhead;

        int k=0;

        while(p.next!=null&&q.next!=null)

        {

            int x=p.next.val;

            int y=q.next.val;

            p=p.next;

            q=q.next;

            int sum=x+y+k;

            if(sum/10>0)

            k=1;

            else

            k=0;

            curry.next=new ListNode(sum%10);

            curry=curry.next;

        }

        return dummyhead.next;

    }

}

第二遍代码
但是还是错了
有一个报错
最终版

class Solution {

    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {

        ListNode dummyhead = new ListNode(0);

        ListNode p=l1,q=l2,curry=dummyhead;

        int k=0;

        while(p!=null||q!=null)

        {

            int x = (p != null) ? p.val : 0;

            int y = (q != null) ? q.val : 0;

            if(p!=null)

            p=p.next;

            if(q!=null)

            q=q.next;

            int sum=x+y+k;

            if(sum/10>0)

            k=1;

            else

            k=0;

            curry.next=new ListNode(sum%10);

            curry=curry.next;

        }

        if(k>0)

        curry.next=new ListNode(k);

        curry=curry.next;

        return dummyhead.next;

    }

}

OKOK终于过了
好几种情况的分析
考虑进位大于0
已经两个链条是否相同长度

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Xia0Mo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值