

java
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
//设置哨兵节点
ListNode dummy = new ListNode(0);
ListNode curr = dummy;
//处理进位
int carry = 0;
while(l1 != null || l2 != null || carry != 0){
int val1 = (l1 != null) ? l1.val : 0;
int val2 = (l2 != null) ? l2.val : 0;
//求和
int sum = val1 + val2 + carry;
carry = sum / 10;
//设置下一个节点值,并将指针后移一位
curr.next = new ListNode(sum % 10);
curr = curr.next;
if(l1 != null) l1 = l1.next;
if(l2 != null) l2 = l2.next;
}
return dummy.next;
}
}
这段代码开头先设置了一个哨兵节点,如果不设置哨兵节点在给这个链表加上后续元素的时候如果curr是null节点,在执行curr.next会空指针异常报错,所以代码需要在开始进行判断;同时在初始化第一个元素的时候会与循环内得到后续元素的代码发生重复,造成代码冗余。
以下情况可以直接设置哨兵节点:
1.从零开始凭空拼凑新的链表的时候
2.原链表的头节点可能被删除、修改或者替换的时候;