这道题还是语法不熟练的问题
其实思路差不多
第一次代码是这样的
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) 是一个特殊的节点,它不是数据集合的一部分,但被添加到数据结构中以简化算法的实现。哨兵节点通常用于链表和散列表等数据结构中。
哨兵节点的作用:
-
简化边界条件处理:
使用哨兵节点可以避免在算法实现中对边界条件的检查,因为哨兵节点充当了“占位符”,使得一些操作(如插入和删除)不需要特殊处理空链表的情况。 -
提供默认值:
哨兵节点可以存储一个默认值,当数据结构为空时,可以返回这个默认值,而不是返回null
。 -
实现循环链表:
在循环链表中,哨兵节点可以作为起点,使得遍历操作更加简单。 -
避免空指针异常:
在某些情况下,使用哨兵节点可以避免空指针异常,因为即使数据结构为空,哨兵节点仍然存在。
示例:
在您提供的代码 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
已经两个链条是否相同长度