【链表专题】字节真题:单链表相加

本问题对应课程链接:剑指offer刷题第四期

要求:

1、请打卡你的解题代码,如果能简单说一下思路则简单说一下思路。
2、给出你代码所用的时间复杂度和空间复杂度

代码参考

// 注意,关于链表节点的定义(ListNode),我这里没有给出来哦
class SolutionAdd {
    // 反转链表
    public ListNode  reverseList(ListNode node){
        ListNode pre = null;
        ListNode q= null;
        while (node != null) {
            q= node.next;
            node.next = pre;
            pre = node;
            node = q;
        }
        return pre;
    }
    // 单链表相加
    public ListNode  addTwoNumbers(ListNode head1, ListNode head2) {
        // 虚拟头节点
        ListNode listNode = new ListNode(0);
        ListNode p = listNode;
        // sum 用来存放进位
        int sum = 0;
        while (head1 != null || head2 != null || sum!=0) {
            if (head1 != null) {
                sum += head1.val;
                head1 = head1.next;
            }

            if (head2 != null) {
                sum += head2.val;
                head2 = head2.next;
            }
            p.next = new ListNode(sum % 10);
            sum = sum / 10;
            p = p.next;
        }
        return listNode.next;
    }
}

时间复杂度:O(n+m)
空间复杂度:O(1)

共以下 43 个回答

  • 喵喵神教🐈 普通 2023年10月19日 下午4:22

    “ java
    //简单粗暴的方法

    public class Solution {
    public ListNode addList(ListNode head1, ListNode head2){
    if (head1null && head2null) return null;
    else if(head1 null) return head2;
    else if(head2
    null) return head1;
    ListNode rever1 = reverseList(head1);
    ListNode rever2 = reverseList(head2);
    return reverseList(addReverseList(rever1, rever2));
    }

    public ListNode reverseList(ListNode head){
        ListNode pre = null;
        ListNode cur = head;
        while (cur!=null){
            ListNode next = cur.next;
            cur.next = pre;
            pre = cur;
            cur = next;
        }
        return pre;
    }
    
    public ListNode addReverseList(ListNode rever1, ListNode rever2){
        int flag = 0;
        ListNode res = new ListNode(0);
        ListNode point = res;
    
        while (rever1 != null && rever2 != null){
            point.val = rever1.val+rever2.val;
            if (flag == 1){
                point.val+=1;
            }
            if (point.val >9){
                point.val-=10;
                flag = 1;
            }
            point.next = new ListNode(0);
            // 不要忘记,每次移动指针。
            rever1 = rever1.next;
            rever2 = rever2.next;
            point = point.next;
        }
        // 记得加flag。同时处理 += 
        if (flag == 1){
            point.val = 1;
        }
        // 不要忘记flag回0。
        flag = 0;
        while (rever1 != null){
            point.val += rever1.val;
            point.next = new ListNode(0);
    
            rever1 = rever1.next;
            point = point.next;
        }
        while (rever2 != null){
            point.val += rever2.val;
            point.next = new ListNode(0);
            rever2 = rever2.next;   
            point = point.next;
        }
    
        return res;
    }
    

    }

    0 赞同 0 条回复
  • 星河 普通 2023年8月14日 下午4:21

    //反转链表
    func resver(head *ListNode) *ListNode {
    if head.Next nil || head nil {
    return head
    }
    //逆置后的头节点
    node := resver(head.Next)
    head.Next.Next = head
    head.Next = nil
    return node
    }

    func twoSum(head1 *ListNode, head2 *ListNode) *ListNode {
    l1 := resver(head1)
    l2 := resver(head2)
    l3 := &ListNode{}
    ptr := l3
    sum := 0
    for l1 != nil || l2 != nil || sum != 0 {
    if l1 != nil {
    sum += l1.Val
    l1 = l1.Next
    }
    if l2 != nil {
    sum += l2.Val
    l2 = l2.Next
    }
    ptr.Next = &ListNode{Val: sum % 10}
    sum = sum / 10
    ptr = ptr.Next
    }

    return resver(l3.Next)
    

    }

    0 赞同 0 条回复
  • mpweixin用户 永久会员 2023年7月31日 上午11:01
    class Solution {
        //链表相加
        public ListNode addList(ListNode head1, ListNode head2) {
            if(head1 == null && head2 == null) return null;
            else if(head1 == null) return head2;
            else if(head2 == null) return head1;
            ListNode h1 = reverseList(head1);
            ListNode h2 = reverseList(head2);
            return reverseList(addReverseList(h1, h2));
        }
    
        //链表反转
        public ListNode reverseList(ListNode head) {
            if(head.next == null) return head;
            ListNode result = reverseList(head.next);
            head.next.next = head;
            head.next = null;
            return result;
        }
    
        //反转链表相加
        public ListNode addReverseList(ListNode head1, ListNode head2) {
            // 虚拟头节点
            ListNode listNode = new ListNode(0);
            // 用于找到头结点
            ListNode p = listNode;
            // sum 用来存放进位
            int sum = 0;
            while (head1 != null || head2 != null || sum!=0) {
                if (head1 != null) {
                    sum += head1.val;
                    head1 = head1.next;
                }
    
                if (head2 != null) {
                    sum += head2.val;
                    head2 = head2.next;
                }
                p.next = new ListNode(sum % 10);
                sum = sum / 10;
                p = p.next;
            }
            return listNode.next;
        }
    }
    
    1 赞同 0 条回复
  • 望仔 普通 2023年7月28日 下午6:04
    func MyAddList(head1, head2 *ListNode) *ListNode {
        l1, l2 := reverseList(head1), reverseList(head2)
        return reverseList(AddList(l1, l2))
    }
    
    func AddList(head1, head2 *ListNode) *ListNode {
        /*
            1、先反转链表,然后遍历,相加,进位(可能需要创建新节点);
            2、最后再反转一次链表;
        */
        res := &ListNode{Val: -1}
        cur := res
        carry := 0
        for head1 != nil || head2 != nil || carry > 0 {
            value1, value2 := 0, 0
    
            if head1 != nil {
                value1 = head1.Val
            }
    
            if head2 != nil {
                value2 = head2.Val
            }
    
            tmpNode := &ListNode{Val: (value2 + value1 + carry) % 10}
            cur.Next = tmpNode
            cur = cur.Next
    
            carry = (value2 + value1 + carry) / 10
        }
    
        return res.Next
    }
    
    func reverseList(head *ListNode) *ListNode {
        /*
            1、反转链表
        */
        var pre *ListNode
        cur := head
    
        if head == nil {
            return nil
        }
    
        for head != nil {
            cur = head
            head = head.Next
            cur.Next = pre
            pre = cur
        }
    
        return pre
    }
    
    0 赞同 0 条回复
  • wowo 普通 2023年7月20日 上午3:15

    反转链表,相加后如果需要进位将下两个相加的节点中的一个val+1,如果下一个节点是null,再添加一个节点node.val=1

    class Solution:
        def reverse(self, head:ListNode) -> ListNode:
            # 原地反转链表
            if not head.next:
                return head
    
            prev = None
            cur = head
            while (cur):
                next_prev = cur
                next_cur = cur.next
    
                cur.next = prev
    
                cur = next_cur
                prev = next_prev
    
            return prev
    
        def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
            head1 = self.reverse(l1)
            head2 = self.reverse(l2)
    
            cur1 = head1
            cur2 = head2
            addhead = ListNode()
            cur3 = addhead
            while (cur1 or cur2):
                if (cur1 and cur2):
                    add = cur1.val + cur2.val
                elif cur1 and (not cur2):
                    add = cur1.val
                else:
                    add = cur2.val
    
                if (add < 10):
                    cur3.next = ListNode(add)
                else:
                    add = add - 10
                    cur3.next = ListNode(add)
                    if cur1.next:
                        cur1.next.val = cur1.next.val + 1
                    else:
                        cur1.next = ListNode(1)
    
                cur1 = cur1.next if cur1 else None
                cur2 = cur2.next if cur2 else None
                cur3 = cur3.next
    
            return self.reverse(addhead.next)
    
    0 赞同 0 条回复
  • 今天没时间刷题 普通 2023年7月19日 下午8:46
    //时间O(M+N), 空间O(1)
    struct Listnode
    {
        Listnode(int val):val(val){}
        int val;
        Listnode* next;
    };
    
    Listnode* reverseList(Listnode* head)
    {
        Listnode* pre = nullptr;
        Listnode* cur = head;
    
        while(cur)
        {
            Listnode* next = cur->next;
            cur->next = pre;
            pre = cur;
            cur = next;
        }
        return pre;
    }
    
    Listnode* sumTwoList(Listnode* list1, Listnode* list2)
    {
        reverseList(list1);
        reverseList(list2);
        Listnode* res = new Listnode(0);
        Listnode* pre = res;
        int sum{0};
        while(list1 || list2 || sum)
        {
            if(list1)
            {
                sum += list1->val;
                list1 = list1->next;
            }
    
            if(list2)
            {
                sum += list2->val;
                list2 = list2->next;
            }
    
            Listnode* cur = new Listnode(sum & 10);
            sum = sum/10;
            pre->next = cur;
            pre = cur;
    
        }
        return reverseList(res->next);
    }
    
    0 赞同 0 条回复
  • Marshan 普通 2023年7月13日 下午10:24
    struct ListNode{
        int val;
        ListNode *next;
        ListNode(int val):val(val),next(nullptr){}
    };
    ListNode *func(ListNode *head1,ListNode *head2){
    
        return head1==nullptr?head2:head1;
    
        ListNode *newHead = nullptr;
        ListNode *p,*q,*r;
        //反转第一个
        p = nullptr;
        q = head1;
        r = head1->next;
        while(q){
            q->next = p;
            p = q;
            q = r;
            if(r)
                r = r->next;
        }
        ListNode *newhead1 = p;
        //反转第二个
        p = nullptr;
        q = head2;
        r = head2->next;
        while(q){
            q->next = p;
            p = q;
            q = r;
            if(r)
                r = r->next;
        }
        ListNode *newhead2 = p;
    
        newHead = new ListNode(0);
        r = newHead;
        p = newhead1;
        q = newhead2;
        //瑕疵,进位未完成
        int tmp = 0;
        while(p && q){
            if(p->val + q->val + tmp > 9){
                r->next = new ListNode((p->val + q->val + tmp) % 10);
                tmp = 1;
            }
            else{
                r->next = new ListNode((p->val + q->val + tmp));
                tmp = 0;
            }
            p = p->next;
            q = q->next;
            r = r->next;
        }
        while(p){
            if(p->val + tmp > 9){
                r->next = new ListNode((p->val + tmp) % 10);
                tmp = 1;
            }
            else{
                r->next = new ListNode((p->val + tmp));
                tmp = 0;
            }
            p = p->next;
            r = r->next;
        }
        while(q){
            if(q->val + tmp > 9){
                r->next = new ListNode((q->val + tmp) % 10);
                tmp = 1;
            }
            else{
                r->next = new ListNode((q->val + tmp));
                tmp = 0;
            }
            q = q->next;
            r = r->next;
        }
        if(tmp){
            r->next = ListNode(tmp);
            tmp = 0;
        }
    
    
        //反转结果
        p = nullptr;
        q = newHead->next;
        r = q->next;
        while(q){
            q->next = p;
            p = q;
            q = r;
            if(r)
                r = r->next;
        }
        newHead = p;
    
    
        return newHead;
    
    
    }
    
    0 赞同 0 条回复
  • mpweixin用户 普通 2023年7月13日 下午1:14
    #include<iostream>
    //将两个十进制整数,每位用一个链表节点表示,相加
    struct ListNode {
      int val;
      ListNode *next;
    };
    class Solution {
    public:
      ListNode *reverseList(ListNode *head) {
        ListNode *pre, *cur, *next, *tmp;
        pre = NULL;
        cur = head;
        if (cur == NULL || cur->next == NULL)
          return head;
        next = cur->next;
    
        while (cur != NULL && next != NULL) {
          cur->next = pre;
          tmp = next->next;
          next->next = cur;
    
          pre = cur;
          cur = next;
          next = tmp;
        }
        return cur;
      }
    
      ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) {
        ListNode *newhead = new ListNode;
        ListNode *tmp = newhead;
        int sum = 0;
        while (l1 != nullptr || l2 != nullptr || sum != 0) {
            if(l2!=nullptr){
              sum += l2->val;
              l2 = l2->next;
            }
            if(l1!=nullptr){
              sum += l1->val;
              l1 = l1->next;
            }
            tmp->next = new ListNode;
            tmp->val = sum;
            sum /= 10;
            tmp = tmp->next;
    
        }
        return newhead->next;
    
      }
    };
    
    0 赞同 0 条回复
  • momo 普通 2023年7月12日 下午3:02

    时间复杂度O(max(m, n))
    空间复杂度O(1)

    class Solution {
        public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
            ListNode r1 = reverseList(l1);
            ListNode r2 = reverseList(l2);
            ListNode dummy = new ListNode(0);
            int carry = 0;
            while (r1 != null || r2 != null) {
                int a1 = r1 == null ? 0 : r1.val;
                int a2 = r2 == null ? 0 : r2.val;
                int sum = a1 + a2 + carry;
                ListNode node = new ListNode(sum % 10);
                node.next = dummy.next;
                dummy.next = node;
                carry = sum / 10;
                r1 = r1 == null ? r1 : r1.next;
                r2 = r2 == null ? r2 : r2.next;
            }
            if (carry != 0) {
                ListNode node = new ListNode(1);
                node.next = dummy.next;
                dummy.next = node;
            }
            return dummy.next;
        }
        private ListNode reverseList(ListNode head) {
            if (head == null || head.next == null) {
                return head;
            }
            ListNode ans = reverseList(head.next);
            head.next.next = head;
            head.next = null;
            return ans;
        }
    }
    
    0 赞同 0 条回复
  • 达浪达浪 普通 2023年7月12日 下午2:23
    class Solution {
    public:
        ListNode* reverseL(ListNode* head){
            if(!head || !head->next) return head;
            ListNode* newNode= reverseL(head->next);
            head->next->next=head;
            head->next=nullptr;
            return newNode;
        }
    
        ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
            //反转链表
            l1=reverseL(l1);
            l2=reverseL(l2);
            int carry=0;
            ListNode* pre=nullptr;
    
    
            while(l1 || l2 || carry){
                int val1=l1==nullptr?0:l1->val;
                int val2=l2==nullptr?0:l2->val;
    
                ListNode* node=new ListNode((val1+val2+carry)%10);
                carry=(val1+val2+carry)/10;
                node->next=pre;
                pre=node;
    
                l1=l1?l1->next:nullptr;
                l2=l2?l2->next:nullptr;
    
            }
            return pre;
    
        }
    };
    
    0 赞同 0 条回复
  • NullPointerException 普通 2023年7月12日 下午1:21

    public ListNode addInList (ListNode head1, ListNode head2) {
    // write code here
    //先翻转链表 从个位数相加
    if(head1null)
    {
    return head2;
    }
    if(head2
    null)
    {
    return head1;
    }
    ListNode pre1=new ListNode(0);
    ListNode pre2=new ListNode(0);
    pre1.next=null;
    pre2.next=null;
    ListNode temp;
    while(head1!=null)
    {
    temp=head1;
    head1=head1.next;
    temp.next=pre1.next;
    pre1.next=temp;
    }
    while(head2!=null)
    {
    temp=head2;
    head2=head2.next;
    temp.next=pre2.next;
    pre2.next=temp;
    }
    head1=pre1.next;
    head2=pre2.next;
    ListNode result=new ListNode(0);
    temp=result;
    int sum=0;
    while(head1!=null||head2!=null||sum!=0)
    {
    if(head1!=null)
    {
    sum=sum+head1.val;
    head1=head1.next;
    }
    if(head2!=null)
    {
    sum=sum+head2.val;
    head2=head2.next;
    }
    temp.next=new ListNode(sum%10);
    temp=temp.next;
    sum=sum/10;
    }
    temp=result.next;
    ListNode head=temp;
    result.next=null;
    while(head!=null)
    {
    temp=head;
    head=head.next;
    temp.next=result.next;
    result.next=temp;
    }
    return result.next;
    }
    }

    0 赞同 0 条回复
  • Terence💧 普通 2023年7月11日 下午11:08
    //用单向链表表示十进制整数,求两个整数的和。如:1234+34 =1268
    type ListNode struct {
        Val  int
        Next *ListNode
    }
    
    func AddTwoList(headA, headB *ListNode) *ListNode {
        l1 := reverseList(headA)
        l2 := reverseList(headB)
        ret := &ListNode{}
        l := ret
    
        sum := 0
        for l1 != nil && l2 != nil {
            sum += l1.Val
            l1 = l1.Next
    
            sum += l2.Val
            l2 = l2.Next
    
            l.Next = &ListNode{Val: sum % 10}
            sum = sum / 10
    
            l = l.Next
        }
    
        if l1 != nil {
            l.Next = l1
            l = l.Next
        }
    
        if l2 != nil {
            l.Next = l2
            l = l.Next
        }
        return reverseList(ret.Next)
    }
    
    func reverseList(head *ListNode) *ListNode {
        if head == nil || head.Next == nil {
            return head
        }
        temp := reverseList(head.Next)
        head.Next.Next = head
        head.Next = nil
        return temp
    }
    

    先反转两个待合并链表,新建节点作为合并后的链表,相加完值之后再反转回来

    0 赞同 0 条回复
  • #00456B 普通 2023年7月11日 下午8:26

    LC 两数相加

    链表逆序存储,所以直接按照顺序进行计算就好了,就是在相加过程中要注意进位的问题。
    然后在head前面可以用一个虚拟头节点,这样可以避免一些边界问题。

    class Solution {
    public:
        ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
            ListNode* dummyHead = new ListNode();
            ListNode* cur = dummyHead;
            int carry = 0;
            while(l1 || l2){
                int val = carry;
                if(l1){
                    val += l1->val;
                    l1 = l1->next;
                }
                if(l2){
                    val += l2->val;
                    l2 = l2->next;
                }
                carry = val>9 ? 1:0;
                val = val%10;
                ListNode* temp = new ListNode(val);
                cur->next = temp;
                cur = cur->next;
            }
            if(carry>0){
                ListNode* temp = new ListNode(carry);
                cur->next = temp;
                cur = cur->next;
            }
            return dummyHead->next;
        }
    };
    

    LC445 两数相加2

    这里的数字是顺序存储的,所以需要做一个逆序的过程。因为加法运算是从个位开始计算的,但是链表顺序存储的话在表头的部分是高位,如果从高位开始进行加法运算就会不好计算进位。
    进行逆序计算有两种方法:
    1. 链表反转
    2. 通过stack等其他数据结构进行结果的存储,然后进行加法运算

    这题和剑指 Offer II 025. 链表中的两数相加是相同的题目。
    ### 链表反转
    这里就是单纯得先对链表进行反转,然后使用上面两数相加的方法。

    “`cpp
    class Solution {
    public:
    ListNode* reverse(ListNode* head){
    ListNode* pre = NULL;
    ListNode* cur = head;
    ListNode* temp;
    while(cur){
    temp = cur->next;
    cur->next = pre;
    pre = cur;
    cur = temp;
    }
    return pre;
    }
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
    l1 = reverse(l1);
    l2 = reverse(l2);
    ListNode* dummyHead = new ListNode();
    ListNode* cur = dummyHead;
    int carry = 0;
    while(l1 || l2){
    int val = carry;
    if(l1){
    val += l1->val;
    l1 = l1->next;
    }
    if(l2){
    val += l2->val;
    l2 = l2->next;
    }
    carry = val/10;
    val = val%10;
    cur->next = new ListNode(val);
    cur = cur->next;
    }
    if(carry>0){
    cur->next = new ListNode(carry);
    cur = cur->next;
    }
    dummyHead->next = reverse(dummyHead->next);
    return dummyHead->next;
    }
    };

    ### 使用stack
    用两个栈将两个链表的内容存入,然后加法计算后再输出到链表节点。因为栈就是一个先进后出的过程,相当于逆序了。
    ```cpp
    class Solution {
    public:
        ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
            stack<int> stk1;
            stack<int> stk2;
            while(l1){
                stk1.push(l1->val);
                l1 = l1->next;
            }
            while(l2){
                stk2.push(l2->val);
                l2 = l2->next;
            }
            ListNode* dummyHead = new ListNode();
            int carry = 0;
            while(!stk1.empty() || !stk2.empty()){
                int val = carry;
                if(!stk1.empty()){
                    val += stk1.top();
                    stk1.pop();
                }
                if(!stk2.empty()){
                    val += stk2.top();
                    stk2.pop();
                }
                carry = val/10;
                val = val%10;
                ListNode* cur = new ListNode(val);
                cur->next = dummyHead->next;
                dummyHead->next = cur;
            }
            if(carry>0){
                ListNode* cur = new ListNode(carry);
                cur->next = dummyHead->next;
                dummyHead->next = cur;
            }
            return dummyHead->next;
        }
    };
    
    0 赞同 0 条回复
  • 枫梓。 普通 2023年7月11日 下午4:18
    List *listPlus (List *list1, List *list2) {
        list1->reverse();
        list2->reverse();
        Node *cur1 = list1->head;
        Node *cur2 = list2->head;
        std::vector<int> arr;
        int flag = 0; // 进位
        while(cur1 && cur2) {
            int temp = cur1->val + cur2->val + flag;
            if(temp > 9) {
                arr.push_back(temp - 10);
                flag++;
            } else {
                arr.push_back(temp);
                flag = 0;
            }
            cur1 = cur1->next;
            cur2 = cur2->next;
        }
        Node *cur = cur1 ? cur1 : cur2;
        while(cur) {
            arr.push_back(cur-> val + flag);
            flag = 0;
            cur = cur->next;
        }
        arr.push_back(flag);
        List *ans = new List(arr);
        ans->reverse();
        return ans;
    }
    

    时间复杂度 O(m+n) 空间复杂度O(1)

    0 赞同 0 条回复
  • doordie. 普通 2023年7月11日 上午10:52
    class Solution {
        // 先反转,再相加,再反转
        public addList(ListNode l1, ListNode l2){
            ListNode cur1 = reverse(l1);
            ListNode cur2 = reverse(l2);
            // 虚拟头节点
            ListNode result = new ListNode(0);
            ListNode cur = result;
            // 进位标识符
            int sum = 0;
            while(cur1!=null||cur2!=null||sum!=0){
                if(cur1!=null){
                    sum += cur1.val;
                    cur1 = cur1.next;
                }
                if(cur2!=null){
                    sum += cur2.val;
                    cur2 = cur2.next;         
                }
                cur.next = new ListNode(sum%10);
                sum = sum/10;
                cur = cur.next;
            }
            return reverse(result.next);
        }
    
        public ListNode reverse(ListNode head){
            // 原地反转
            ListNode pre = null;
            ListNode cur = head;
            while(cur!=null){
                ListNode temp = cur.next;
                cur.next = pre;
                pre = cur;
                cur = temp;
            }
            return pre;
        }
    }
    
    0 赞同 0 条回复
  • ppopp 普通 2023年7月11日 上午12:15

    /**
    * Definition for singly-linked list.
    * struct ListNode {
    * int val;
    * ListNode *next;
    * ListNode() : val(0), next(nullptr) {}
    * ListNode(int x) : val(x), next(nullptr) {}
    * ListNode(int x, ListNode *next) : val(x), next(next) {}
    * };
    */

    class Solution {
    public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
    stack s1, s2;
    //push elements in l1 l2 to s1 s2
    while(l1){
    s1.push(l1->val);
    l1 = l1->next;
    }
    while(l2){
    s2.push(l2->val);
    l2 = l2->next;
    }
    int res= 0;
    ListNode* ans = nullptr;
    while(!s1.empty() or !s2.empty() or res != 0){
    int a = s1.empty() ? 0 : s1.top();
    int b = s2.empty() ? 0 : s2.top();
    if(!s1.empty()) s1.pop();
    if(!s2.empty()) s2.pop();
    //judge if cur > 10
    int cur = a + b + res;
    res = cur/10;
    cur %= 10;
    //建立新节点,头插法建立答案链表
    auto p = new ListNode(cur);
    p -> next = ans;
    ans = p;
    }
    return ans;
    }
    };

    0 赞同 0 条回复
  • 周小二 普通 2023年7月11日 上午12:07
    public class SolutionAdd {
        //链表
        static class ListNode {
            ListNode(int val) {
                this.val = val;
            }
            int val;
            ListNode next;
        }
        //反转链表
        private ListNode reverseList(ListNode node) {
            if (node == null) {
                return null;
            }
            ListNode next = null, pre = null;
            while (node != null) {
                next = node.next;
                node.next = pre;
                pre = node;
                node = next;
            }
            return pre;
        }
    
        //单列表相加
        public ListNode addTwoNumbers(ListNode node1, ListNode node2) {
            ListNode rev1 = reverseList(node1);
            ListNode rev2 = reverseList(node2);
            //虚拟头节点
            ListNode listNode = new ListNode(0);
            ListNode cur = listNode;
            int sum = 0;
            while (rev1 != null || rev2 != null || sum != 0) {
                if (rev1 != null) {
                    sum += rev1.val;
                    rev1 = rev1.next;
                }
                if (rev2 != null) {
                    sum += rev2.val;
                    rev2 = rev2.next;
                }
                cur.next = new ListNode(sum / 10);
                sum = sum % 10;
                cur = cur.next;
            }
            ListNode result = reverseList(listNode.next);
            return result;
        }
    }
    
    0 赞同 0 条回复
  • 今天你刷题了嘛 普通 2023年7月10日 下午11:04
    class Solution {
        // 先反转,再相加,再反转
        public addList(ListNode l1, ListNode l2){
            ListNode cur1 = reverse(l1);
            ListNode cur2 = reverse(l2);
            // 虚拟头节点
            ListNode result = new ListNode(0);
            ListNode cur = result;
            // 进位标识符
            int sum = 0;
            while(cur1!=null||cur2!=null||sum!=0){
                if(cur1!=null){
                    sum += cur1.val;
                    cur1 = cur1.next;
                }
                if(cur2!=null){
                    sum += cur2.val;
                    cur2 = cur2.next;         
                }
                cur.next = new ListNode(sum%10);
                sum = sum/10;
                cur = cur.next;
            }
            return reverse(result.next);
        }
    
        public ListNode reverse(ListNode head){
            // 原地反转
            ListNode pre = null;
            ListNode cur = head;
            while(cur!=null){
                ListNode temp = cur.next;
                cur.next = pre;
                pre = cur;
                cur = temp;
            }
            return pre;
        }
    }
    

    时间复杂度:O(m+n)
    空间复杂度:O(1)

    0 赞同 0 条回复
  • Fighting boy😀 普通 2023年7月10日 下午8:33

    class Solution {
    public:
    //反转链表
    ListNode* reverseList(ListNode* head) {
    if(!head||!head->next)return head;

        ListNode* cur=head;
        ListNode* pre=nullptr;
        ListNode* temp=nullptr;
        while(cur)
        {
            temp=cur->next;
            cur->next=pre;
            pre=cur;
            cur=temp;
        }
       return pre;
    }
    ListNode* addList(ListNode* t1,ListNode* t2){
        ListNode* f1=reverseList(t1);
        ListNode* f2=reverseList(t2);
        ListNode* ans=nullptr;
        while(f1&&f2){
    
            ans->val+=f1->val+f2->val;
            ans->next->val=ans->val/10;
            ans->val%=10;
            ans=ans->next;
            f1=f1->next;
            f2=f2->next;
        }
        if(f1==nullptr&&f2)
        {
            while(f2)
            {
                ans->val=f2->val;
                ans->next=f2->next;
            }
        }
        if(f1&&!f2)
        {
            while(f1)
            {
                ans->val=f1->val;
                ans->next=f1->next;
            }
        }
        return  reverseList(ans);
    }
    

    };

    0 赞同 0 条回复
  • CKX 普通 2023年7月10日 下午5:51
    /**
     * Definition for singly-linked list.
     * type ListNode struct {
     *     Val int
     *     Next *ListNode
     * }
     */
    
    //反转链表
    func reverse(head *ListNode) *ListNode {
        if head == nil || head.Next == nil {
            return head
        }
    
        temp := reverse(head.Next)
        head.Next.Next = head
        head.Next = nil
        return temp
    }
    
    func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
    
        //虚拟头节点
        dummpy := &ListNode{}
        p := dummpy
    
        l1New := reverse(l1)
        l2New := reverse(l2)
    
        //进位标识符
        sum := 0
    
        for l1New != nil || l2New != nil || sum != 0 {
            if l1New != nil {
                sum += l1New.Val
                l1New = l1New.Next
            }
    
            if l2New != nil {
                sum += l2New.Val
                l2New = l2New.Next
            }
    
            p.Next = &ListNode{Val: sum % 10}
            sum = sum / 10
            p = p.Next
    
        }
    
        return reverse(dummpy.Next)
    
    }
    
    • 时间O(n+m)
    • 空间O(1)
    0 赞同 0 条回复
  • Mooby 普通 2023年7月10日 下午5:09

    一

    0 赞同 0 条回复
  • 刹那芳间 普通 2023年7月10日 下午2:46
    // 注意,关于链表节点的定义(ListNode),我这里没有给出来哦
    class SolutionAdd {
        // 反转链表
        public ListNode  reverseList(ListNode node){
            ListNode pre = null;
            ListNode q= null;
            while (node != null) {
                q= node.next;
                node.next = pre;
                pre = node;
                node = q;
            }
            return pre;
        }
        // 单链表相加
        public ListNode  addTwoNumbers(ListNode head1, ListNode head2) {
            // 虚拟头节点
            ListNode listNode = new ListNode(0);
            ListNode p = listNode;
            // sum 用来存放进位
            int sum = 0;
            while (head1 != null || head2 != null || sum!=0) {
                if (head1 != null) {
                    sum += head1.val;
                    head1 = head1.next;
                }
    
                if (head2 != null) {
                    sum += head2.val;
                    head2 = head2.next;
                }
                p.next = new ListNode(sum % 10);
                sum = sum / 10;
                p = p.next;
            }
            return listNode.next;
        }
    }
    
    0 赞同 0 条回复
  • 波雅汉库克 普通 2023年7月10日 下午2:40
    class Solution {
    public:
        ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
            stack<int> st1;
            stack<int> st2;
            while(l1!=nullptr){
                st1.push(l1->val);
                l1 = l1->next;
            }
            while(l2!=nullptr){
                st2.push(l2->val);
                l2 = l2->next;
            }
            int prev = 0;
            ListNode* dummyHead = new ListNode(0);
            while(!st1.empty() || !st2.empty()){
                int n1 = 0;
                int n2 = 0;
                if(!st1.empty()){
                    n1 = st1.top();
                    st1.pop();
                }
                if(!st2.empty()){
                    n2 = st2.top();
                    st2.pop();
                }
                int val = n1 + n2 + prev;
                prev = 0;
                if(val > 9){
                    prev = 1;
                    val = val-10;
                }
    
                ListNode* node = new ListNode(val);
                node->next = dummyHead->next;
                dummyHead->next = node;
            }
            if(prev == 1){
                ListNode* node = new ListNode(1);
                node->next = dummyHead->next;
                dummyHead->next = node;
            }
            return dummyHead->next;
        }
    };
    

    时间复杂度: O(m+n)
    空间复杂度:O(m+n)

    0 赞同 0 条回复
  • V2ero 普通 2023年7月10日 下午1:57
    // 同链表翻转
    function reverseList(head: ListNode | null): ListNode | null {
        // 递归边界
        if (!head || !head.next) {
            return head;
        }
        const newHead = reverseList(head.next);
        head.next.next = head; // 最后一次递归节点为倒数第二个
        head.next = null; // 避免成环
        return newHead;
    }
    
    const add = (l1: ListNode | null, l2: ListNode | null) => {
        let newL1 = reverseList(l1); // 翻转链表
        let newL2 = reverseList(l2); // 翻转链表
        const dumy = new ListNode(-1);
        let pre = dumy;
        let res = 0;
        while (newL1 || newL2) {
            const val1 = newL1 ? newL1.val : 0; // 因为使用了 || ,所以需要考虑不存在时的相加异常
            const val2 = newL2 ? newL2.val : 0;
            const val = val1 + val2;
            pre.next = new ListNode((val % 10) + res);
            if (val > 9) {
                res = 1; // 判断进位值
            } else {
                res = 0;
            }
            pre = pre.next;
            newL1 = newL1 && newL1.next;
            newL2 = newL2 && newL2.next;
        }
        return reverseList(dumy.next);
    };
    
    0 赞同 0 条回复
  • mpweixin用户 普通 2023年7月10日 下午12:44

    打卡

    0 赞同 0 条回复
  • 北辰 普通 2023年7月10日 上午10:45
    public class 单链表相加 {
    
        public static void main(String[] args) {
            ListNode head1 = new ListNode(1);
            ListNode node2 = new ListNode(2);
            ListNode node3 = new ListNode(3);
            ListNode node4 = new ListNode(9);
            head1.next = node2;
            node2.next = node3;
            node3.next = node4;
            node4.next = null;
    
            ListNode head2 = new ListNode(3);
            ListNode node5 = new ListNode(9);
            head2.next = node5;
            node5.next = null;
    
            System.out.println(linkedlistAdd(head1,head2));
        }
    
        public static int linkedlistAdd(ListNode list1,ListNode list2) {
            ListNode head1 = reverseLinkedList(list1);
            ListNode head2 = reverseLinkedList(list2);
    
            ListNode curr1 = head1,curr2 = head2;
            int k=0,ans=0;
            while(curr1!=null&&curr2!=null) {
                int temp = curr1.val + curr2.val;
                temp = (int) (temp*Math.pow(10, k));
                ans+=temp;
                k++;
                curr1 = curr1.next;
                curr2 = curr2.next;
            }
            while(curr1!=null) {
                ans+=curr1.val*Math.pow(10,k);
                k++;
                curr1 = curr1.next;
            }
            while(curr2!=null) {
                ans+=curr2.val*Math.pow(10,k);
                k++;
                curr2 = curr2.next;
            }
            return ans;
        }
    
        public static ListNode reverseLinkedList(ListNode head) {
            if(head==null || head.next==null) {
                return head;
            }
            ListNode curr=head,pre = null;
            while(curr!=null) {
                ListNode temp = curr.next;
                curr.next = pre;
                pre = curr;
                curr = temp;
            }
            return pre;
        }
    
    }
    
    //class ListNode{
    //  int val;
    //  ListNode next;
    //  public ListNode(int val) {
    //      this.val = val;
    //  }
    //}
    

    时间复杂度:O(n+m)
    空间复杂度:O(1)

    0 赞同 0 条回复
  • CaCO3 永久会员 2023年7月10日 上午8:53

    ”’java
    class Solution {
    public ListNode addReTwoNumbers(ListNode l1, ListNode l2) {
    //单链表相加
    //先将链表进行反转,再链表相加,最后把结果反转
    l1 = reverseNode(l1);
    l2 = reverseNode(l2);
    ListNode head = addTwoNumbers(l1,l2);
    return reverseNode(head);
    }

    public ListNode addTwoNumbers(ListNode l1,ListNode l2){
        ListNode cur = new ListNode(0);
        ListNode pre = cur;
        int more = 0;
        while(l1 != null || l2 != null){
            int x = l1 == null ? 0 :l1.val;
            int y = l2==null ? 0:l2.val;
            int sum = x+y+more;
            sum = sum % 10;
            more = sum/10;
            cur.next = new ListNode(sum);
            cur = cur.next;
            if(l1 != null){
                l1 = l1.next;
            }
            if(l2 != null){
                l2 = l2.next;
            }
        }
        if(more == 1){
            cur.next = new ListNode(more);
        }
        return pre.next;
    }
    
    //反转链表
    public ListNode reverseNode(ListNode head){
        ListNode pre = null;
        while(head != null){
            ListNode next = head.next;
            head.next = pre;
            pre = head;
            head = next;
        }
        return pre.next;
    }
    

    }
    ”’
    时间复杂度O(m+n)
    空间复杂度O(1)

    0 赞同 0 条回复
  • Luminous 普通 2023年7月10日 上午12:39
    /**
     * 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) {
            if(l1==null||l2==null) return null;
            //1.将链表反转
            ListNode head1=reverseList(l1);
            ListNode head2=reverseList(l2);
            //2.进行链表上的数相加
            return addList(head1,head2);
        }
    
        public ListNode addList(ListNode head1,ListNode head2){
            ListNode dummyHead=new ListNode(0);
            ListNode cur=dummyHead;
            int carry=0;//保存进位数据
            int sum=0;//每次加后的总和
            //遍历每一条链表直至其中两条链表为空
            while(head1!=null||head2!=null){
                //进行模拟加法
                sum=(head1==null?0:head1.val)+(head2==null?0:head2.val)+carry;
                //注意sum必须>=
                carry=sum>=10?1:0;
                sum=sum>=10?sum-10:sum;
                //创建新的节点插入到结果链表中,使用头插法可以直接反转链表
                ListNode node=new ListNode(sum);
                node.next=dummyHead.next;
                dummyHead.next=node;
                //将两个链表向前前进一步
                head1= head1==null?null:head1.next;
                head2= head2==null?null:head2.next;
            }
            //处理最后一位可能产生的进位
            if(carry>0){
                ListNode node=new ListNode(carry);
                node.next=dummyHead.next;
                dummyHead.next=node;
            }
            return dummyHead.next;
        }
        //反转链表
        public ListNode reverseList(ListNode head){
            if(head==null || head.next==null) return head;
            ListNode tmp=reverseList(head.next);
            head.next.next=head;
            head.next=null;
            return tmp;
        }
    }
    
    0 赞同 0 条回复
  • 长河呼叫黄江 普通 2023年7月9日 下午11:36

    Day4:下面是代码

    class Solution {
        public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
            l1 = reverseList(l1);
            l2 = reverseList(l2);
            ListNode l3 = addTwoList(l1,l2);
            return reverseList(l3);
        }
    
        public ListNode reverseList(ListNode head){
            if(head == null || head.next == null){
                return head;
            }
            ListNode newList = reverseList(head.next);
            head.next.next = head;
            head.next = null;
            return newList;
        }
    
        public ListNode addTwoList(ListNode l1, ListNode l2) {
            ListNode pre = new ListNode(0);
            ListNode cur = pre;
            int carry = 0;
    
            while(l1 != null || l2 != null){
                int x = l1 == null ? 0 : l1.val;
                int y = l2 == null ? 0 : l2.val;
                int sum = x + y + carry;
    
                carry = sum / 10;
                sum = sum % 10;
                cur.next = new ListNode(sum);
    
                cur = cur.next;
                if(l1 != null){
                    l1 = l1.next;
                }
                if(l2 != null){
                    l2 = l2.next;
                }
            }
            if(carry == 1){
                cur.next = new ListNode(1);
            }
            return pre.next;
        }
    }
    
    0 赞同 0 条回复
  • 土豆芋泥包_ 普通 2023年7月9日 下午11:04

    反转链表

    class Solution{
        public ListNode reverseList(ListNode node){
            ListNode pre = null;
            ListNode cur = null;
            while(node!=null){
                cur = node.next;
                node.next = pre;
                pre = node;
                node = cur;
            }
            return pre;
        }
    
        public ListNode addTwoNumbers(ListNode head1, ListNode head2){
            ListNode l1 = reverseList(head1);
            ListNode l2 = reverseList(head2);
            ListNode listNode = new ListNode(0);
            ListNode p = listNode;
            int sum = 0;
            while(l1!=null||l2!=null||sum!=0){
                if(l1!=null){
                    sum += l1.val;
                    l1 = l1.next;
                }
                if(l2!=null){
                    sum += l2.val;
                    l2 = l2.next;
                }
                p.next = new ListNode(sum%10);
                sum = sum/10;
                p = p.next;
            }
            return reverseList(listNode.next);
        }
    
    }
    
    0 赞同 0 条回复
  • 朱志刚 普通 2023年7月9日 下午10:54
    class Solution {
    public:
        ListNode* reverseList(ListNode* head) {
            if(!head||!head->next)return head;
    
            ListNode* cur=head;
            ListNode* pre=NULL;
            ListNode* temp=NULL;
            while(cur)
            {
                temp=cur->next;
                cur->next=pre;
                pre=cur;
                cur=temp;
            }
           return pre;
        }
        ListNode* addList(ListNode* t1,ListNode* t2){
            ListNode* f1=reverseList(t1);
            ListNode* f2=reverseList(t2);
            ListNode* ans=NULL;
            while(f1&&f2){
    
                ans->val+=f1->val+f2->val;
                ans->next->val=ans->val/10;
                ans->val%=10;
                ans=ans->next;
                f1=f1->next;
                f2=f2->next;
            }
            if(f1==NULL&&f2)
            {
                while(f2)
                {
                    ans->val=f2->val;
                    ans->next=f2->next;
                }
            }
            if(f1&&!f2)
            {
                while(f1)
                {
                    ans->val=f1->val;
                    ans->next=f1->next;
                }
            }
            return  reverseList(ans);
        }
    };
    

    首先反转两个链表,然后两个链表按顺序相加,生成新的链接,处理进位,最后将生成的新的链表返转并返回。

    0 赞同 0 条回复
  • June 普通 2023年7月9日 下午10:47
    /**
     * 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) {
            if(l1 == null)
                return l2;
            if(l2 == null)
                return l1;
    
            ListNode head1 = reverseList(l1);
            ListNode head2 = reverseList(l2);
    
            ListNode p1 = head1;
            ListNode p2 = head2;
            int more = 0; //记录进位
            ListNode newHead = null;
            ListNode fast = new ListNode(0);
            ListNode slow = new ListNode(0,fast);
            while(p1 != null || p2 != null)
            {
                if(newHead == null)
                {
                    newHead = new ListNode(0,null);
                    fast = newHead;
                    slow.next = fast;
                }
                else
                {
                    slow = fast;
                    fast = new ListNode(0,null);
                    slow.next = fast;
                }
    
                if(p2 == null)
                {
                    fast.val = (p1.val + more) % 10;
                    more = (p1.val + more) / 10;
                    p1 = p1.next;
                }
                else if(p1 == null)
                {
                    fast.val = (p2.val + more) % 10;
                    more = (p2.val + more) / 10;
                    p2 = p2.next;
                }
                else
                {
                    fast.val = (p1.val + p2.val + more) % 10;
                    more = (p1.val + p2.val + more) / 10;
                    p2 = p2.next;
                    p1 = p1.next;
                }
            }
    
            if(more != 0)
            {
                slow = fast;
                fast =  new ListNode(more,null);
                slow.next = fast;
            }
            return reverseList(newHead);
    
        }
    
        public ListNode reverseList(ListNode head) {
            if(head == null || head.next == null)
                return head;
            ListNode fast = head.next;
            ListNode slow = head;
    
            while(fast!=null)
            {
                ListNode tmp = fast.next;
                fast.next = slow;
                slow = fast;
                fast = tmp;
            }
            head.next = null;
    
            return slow;
        }
    }
    
    
    
    0 赞同 0 条回复
  • 爱吃胡萝卜🥕的兔子🐰 普通 2023年7月9日 下午10:27

    两种方案:
    1. 反转链表

    /**
     * Definition for singly-linked list.
     * type ListNode struct {
     *     Val int
     *     Next *ListNode
     * }
     */
    func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
    
        ll1 := reverseList(l1)
        ll2 := reverseList(l2)
    
        dummy := &ListNode{}
        pre := dummy
    
        isCarry := 0
        for ll1 != nil || ll2 != nil{
            n1 := 0
            if ll1 != nil {
                n1 = ll1.Val
            }
    
            n2 := 0
            if ll2 != nil{
                n2 = ll2.Val
            }
    
            sum := n1 + n2 + isCarry
    
            node := &ListNode{
                Val: sum % 10, 
            }
    
            if sum / 10 == 1{
                isCarry = 1
            } else {
                isCarry = 0
            }
    
            pre.Next = node
            pre = node
    
            if ll1 != nil{
                ll1 = ll1.Next
            }
            if ll2 != nil {
                ll2 = ll2.Next
            }
        }
    
        if isCarry == 1{
            pre.Next = &ListNode{
                Val:1,
            }
        }
    
        return reverseList(dummy.Next)
    }
    
    func reverseList(head *ListNode) *ListNode{
        var pre *ListNode
        cur := head
    
        for cur != nil{
            behind := cur.Next
            cur.Next = pre
            pre = cur
            cur = behind    
        }
    
        return pre
    
    }
    

    方案二:使用栈

    /**
     * Definition for singly-linked list.
     * type ListNode struct {
     *     Val int
     *     Next *ListNode
     * }
     */
    func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
        stack1 := make([]int, 0)
        for l1 !=nil{
            stack1 = append(stack1, l1.Val)
            l1 = l1.Next
        }
    
        stack2 := make([]int, 0)
        for l2 !=nil{
            stack2 =append(stack2, l2.Val)
            l2 = l2.Next
        }
    
        sum := 0
        var cur *ListNode
        for len(stack1) > 0 || len(stack2) > 0 || sum > 0{
            if len(stack1) > 0{
                sum += stack1[len(stack1)-1]
                stack1 = stack1[:len(stack1)-1]
            }
    
            if len(stack2) > 0{
                sum += stack2[len(stack2)-1]
                stack2 = stack2[:len(stack2)-1]
            }
    
            n := &ListNode{
                Val: sum % 10,
            }
            n.Next = cur
            cur = n
    
            sum = sum / 10
        }
    
        return cur
    }
    
    0 赞同 0 条回复
  • ONE PIECE 普通 2023年7月9日 下午10:16
    /**
     * 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 SolutionAdd{
        public ListNode reverseList(ListNode node){
            ListNode tem = null;
            ListNode pre = node;
            while(pre!=null){
                ListNode p = pre.next;
                pre.next = tem;
                tem=pre;
                pre=p;
            }
            return tem;
        }
        public ListNode reverAdd(ListNode head1,ListNode head2){
            ListNode h1=reverseList(head1);
            ListNode h2=reverseList(head2);
            ListNode head = new ListNode(0);
            ListNode res = head;
            while(h1!=null || h2!=null){
                int num1 = h1==null?0:h1.val;
                int num2 = h2==null?0:h2.val;
                int num = num1+num2+res.val;
                if(num<10){
                    res.val = num;
                    res.next=new ListNode(0);
                }else{
                    res.val = num%10;
                    res.next=new ListNode(1);
                }
                h1 = h1==null?null:h1.next;
                h2 = h2==null?null:h2.next;
                res = res.next;
            }
            return reverseList(res);
        }
    }/
    
    }
    

    时间复杂度:O(n);
    空间复杂度:O(n);

    0 赞同 0 条回复
  • 人生何处不青山 普通 2023年7月9日 下午9:44

    TS做法

    /**
     * Definition for singly-linked list.
     * class ListNode {
     *     val: number
     *     next: ListNode | null
     *     constructor(val?: number, next?: ListNode | null) {
     *         this.val = (val===undefined ? 0 : val)
     *         this.next = (next===undefined ? null : next)
     *     }
     * }
     */
    
    function addTwoNumbers(l1: ListNode | null, l2: ListNode | null): ListNode | null {
        let newL1 = reverseList(l1);
        let newL2 = reverseList(l2);
        let newHead = new ListNode(0);
        let cur = newHead;
        let t = 0;
        while (newL1 || newL2 || t !== 0) {
            let sum = t;
            if (newL1) {
                sum += newL1.val;
                newL1 = newL1.next;
            }
            if (newL2) {
                sum += newL2.val;
                newL2 = newL2.next;
            }
            cur.next = new ListNode(sum % 10);
            t = Math.floor(sum / 10);
            cur = cur.next;
        }
        return reverseList(newHead.next);
    };
    
    function reverseList(root: ListNode | null) {
        let prev = null;
        let cur = root;
        while (cur) {
            let t = cur.next;
            cur.next = prev;
            prev = cur;
            cur = t;
        }
        return prev;
    }
    
    0 赞同 0 条回复
  • 艺 普通 2023年7月9日 下午9:30

    “`c++
    /**
    * Definition for singly-linked list.
    * struct ListNode {
    * int val;
    * ListNode *next;
    * ListNode() : val(0), next(nullptr) {}
    * ListNode(int x) : val(x), next(nullptr) {}
    * ListNode(int x, ListNode *next) : val(x), next(next) {}
    * };
    */
    class Solution {
    public:
    ListNode* res(ListNode* head) //反转链表
    {
    ListNode *pre=NULL,*next=NULL;
    while(head)
    {
    next=head->next;
    head->next=pre;
    pre=head;
    head=next;
    }
    return pre;
    }
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
    l1=res(l1);
    l2=res(l2);
    int ca = 0, n1 = 0, n2 = 0, n = 0;
    ListNode *c1 = l1;
    ListNode *c2 = l2;
    ListNode *node = NULL;
    ListNode *pre = NULL;
    while (c1 || c2) {
    n1 = c1 != NULL ? c1->val : 0;
    n2 = c2 != NULL ? c2->val : 0;
    n = n1 + n2 + ca;
    pre = node;
    node = new ListNode(n % 10);
    node->next = pre;
    ca = n / 10;
    c1 = c1 != NULL ? c1->next : NULL;
    c2 = c2 != NULL ? c2->next : NULL;
    }
    if (ca == 1) {
    pre = node;
    node = new ListNode(1);
    node->next = pre;
    }
    return node;
    }
    };

    0 赞同 0 条回复
  • 3A87 普通 2023年7月9日 下午9:29
    class Solution {
    public:
        //反转链表
        ListNode* reverse(ListNode* root)
        {
          ListNode* pre = nullptr;
          ListNode* cur = root;
          ListNode* next = nullptr;
          while(cur != nullptr)
          {
            next = cur->next;
            cur->next = pre;
            pre = cur;
            cur = next;
          }
          return pre;
        }
    
        ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
          ListNode* r1 = reverse(l1);
          ListNode* r2 = reverse(l2);
          int carry = 0; //记录进位
          int sum = 0;
          ListNode* root = new ListNode();
          while(r1 != nullptr || r2 != nullptr)
          {
            int v1 = r1 != nullptr ? r1->val : 0;
            int v2 = r2 != nullptr ? r2->val : 0;
            sum = v1 + v2 + carry;
            carry = sum / 10;
            ListNode* x = new ListNode(sum % 10, root->next);
            root->next = x;
            r1 = r1 != nullptr ? r1->next : r1;
            r2 = r2 != nullptr ? r2->next : r2;
          }
          if(carry)
          {
            ListNode* x = new ListNode(carry, root->next);
            root->next = x;
          }
          return root->next;
        }
    };
    
    0 赞同 0 条回复
  • 片言莫语 普通 2023年7月9日 下午7:58
    public class addListNode {
        public static void main(String[] args){
            ListNode l1 = new ListNode(1);
            l1.next = new ListNode(3);
            l1.next.next = new ListNode(5);
            ListNode l2 = new ListNode(2);
            l2.next = new ListNode(5);
            ListNode res = new singleListNodeSum().singleListNodeSum(l1,l2);
            while (res != null){
                System.out.println(res.val);
                res = res.next;
            }
        }
        public ListNode singleListNodeSum(ListNode l1,ListNode l2){
        l1 = reverseList(l1);
        l2 = reverseList(l2);
    //    虚拟结点
            ListNode pre = new ListNode(0);
            ListNode cur = pre;
            int addPlus = 0;
            while (l1!=null || l2!=null){
                int num1 = l1 == null ? 0:l1.val;
                int num2 = l2 == null ? 0:l2.val;
                int tempSum = num1 + num2 +addPlus;
    //            相加后的进位
                addPlus = tempSum/10;
                tempSum = tempSum % 10;
    //            设置新结点
                cur.next = new ListNode(tempSum);
                cur = cur.next;
                l1 = l1 == null ? l1:l1.next;
                l2 = l2 == null ? l2:l2.next;
            }
            if(addPlus > 0){
                cur.next = new ListNode(addPlus);
            }
            return reverseList(pre.next);
        }
    //    反转链表
        public ListNode reverseList(ListNode node){
            ListNode pre = null;
            ListNode temp = null;
            ListNode cur = node;
            while (cur!=null){
                temp = cur.next;
                cur.next = pre;
                pre = cur;
                cur = temp;
            }
            return pre;
        }
    }
    
    0 赞同 0 条回复
  • H、 普通 2023年7月9日 下午4:37

    Java 单链表相加

    public class SingleListNodeSum {
        public static void main(String[] args) {
    
            ListNode l1 = new ListNode(2);
            l1.next = new ListNode(1);
            l1.next.next = new ListNode(6);
    
            ListNode l2 = new ListNode(3);
            l2.next = new ListNode(5);
    
            ListNode result = new SingleListNodeSum().singleListNodeSum(l1, l2);
    
            while (result != null){
                System.out.print(result.val);
                result = result.next;
            }
    
    
        }
    
        //单链表相加
        public ListNode singleListNodeSum(ListNode l1, ListNode l2){
    
            l1 = reverse(l1);
            l2 = reverse(l2);
    
            //虚拟节点
            ListNode pre = new ListNode(0);
            ListNode cur = pre;
            //用于节点值相加时记录进位
            int addPlus = 0;
    
            while (l1 != null || l2 != null){
                int number1 = l1 == null ? 0 : l1.val;
                int number2 = l2 == null ? 0 : l2.val;
    
                //两个节点值相加,并且加上进位值
                int tempSum = number1 + number2 + addPlus;
                //相加后的进位
                addPlus = tempSum / 10;
                //相加后的个数部分
                tempSum = tempSum % 10;
    
                //设置新节点值
                cur.next = new ListNode(tempSum);
                //后移
                cur = cur.next;
    
                l1 = l1 == null ? l1 : l1.next;
                l2 = l2 == null ? l2 : l2.next;
    
            }
            //如果最后还有进位,则用新节点存放
            if(addPlus > 0) {
                cur.next = new ListNode(addPlus);
            }
    
            return reverse(pre.next);
    
        };
    
        //翻转链表
        public ListNode reverse(ListNode node){
            ListNode pre = null;
            ListNode temp = null;
            ListNode cur = node;
            while (cur != null){
                temp = cur.next;
                cur.next = pre;
                pre = cur;
                cur = temp;
            }
            return pre;
        }
    
    }
    
    0 赞同 0 条回复
  • AD钙奶 普通 2023年7月9日 下午4:32

    纯模拟,反转两遍

    class Solution {
        public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
            ListNode h1 = reverseList(l1);
            ListNode h2 = reverseList(l2);
            ListNode dummyHead = new ListNode(0);
            ListNode cur = dummyHead;
            int p = 0;
    
            while(h1 != null || h2 != null) {
                int x = 0, y = 0;
                if(h1 != null) {
                    x = h1.val;     
                    h1 = h1.next;
                } 
                if(h2 != null) {
                    y = h2.val;     
                    h2 = h2.next;
                } 
                int sum = x + y + p;
                p = sum / 10;
                sum %= 10;
                cur.next = new ListNode(sum);
                cur = cur.next;
            }
            if(p == 1) {
                cur.next = new ListNode(1);
            }
            return reverseList(dummyHead.next);
        }
    
        // 反转链表
        public ListNode reverseList(ListNode head) {
            ListNode cur = head;
            ListNode pre = null;
            while(cur != null) {
                ListNode tmp = cur.next;
                cur.next = pre;
                pre = cur;
                cur = tmp;
            }
            return pre;
        }
    }
    
    0 赞同 0 条回复
  •  普通 2023年7月9日 下午4:24

    c++ 代码链表模拟加法
    class Solution {
    public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)
    {
    ListNode* head=new ListNode(1);
    ListNode* h=head;
    int sum=0;
    while(l1||l2)
    {
    if(l1)
    {
    sum+=l1->val;
    l1=l1->next;
    }
    if(l2)
    {
    sum+=l2->val;
    l2=l2->next;
    }
    ListNode* temp=new ListNode(sum%10);
    sum/=10;
    h->next=temp;
    h=h->next;
    }
    if(sum>0)
    h->next=new ListNode(1);
    return head->next;
    }
    };

    0 赞同 0 条回复
  • 阿尚 普通 2023年7月9日 下午3:30
    //我的代码好长
    class Solution {
        public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
            if(l1 == null && l2 == null) return null;
    
            ListNode h1 = reverseList(l1);
            ListNode h2 = reverseList(l2);
    
            ListNode A = h1;
            ListNode B = h2;
            int num = 0;
            ListNode dummy = new ListNode();
            ListNode pre = dummy;
    
            while(A != null && B != null){
                int sum = A.val + B.val + num;
                if(sum >= 10){
                    num = 1;
                }else{
                    num = 0;
                }
                ListNode newNode = new ListNode(sum % 10);
                pre.next = newNode;
    
                pre = pre.next;
                A = A.next;
                B = B.next;
            }
    
            while(A != null){
                int sum = A.val + num;
                if(sum >= 10){
                    num = 1;
                }else{
                    num = 0;
                }
                ListNode newNode = new ListNode(sum % 10);
                pre.next = newNode;
    
                pre = pre.next;
                A = A.next;
            }
    
            while(B != null){
                int sum = B.val + num;
                if(sum >= 10){
                    num = 1;
                }else{
                    num = 0;
                }
                ListNode newNode = new ListNode(sum % 10);
                pre.next = newNode;
    
                pre = pre.next;
                B = B.next;
            }
    
            if(num == 1){
                ListNode newNode = new ListNode(1);
                pre.next = newNode;
            }
    
            return reverseList(dummy.next);
        }
    
        public ListNode reverseList(ListNode head){
            if(head == null) return null;
    
            ListNode pre = null;
            ListNode nxt = null;
    
            while(head != null){
                nxt = head.next;
    
                head.next = pre;
                pre = head;
    
                head = nxt;
            }
    
            return pre;
        }
    }
    
    0 赞同 0 条回复
  • 桎梏 普通 2023年7月9日 下午2:48
    class Solution {
        public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
    
            l1 = reverse(l1);
            l2 = reverse(l2);
            //链表相加
            ListNode pre = new ListNode(0);
            ListNode cur = pre;
            int plus = 0;
            while(l1 != null || l2 != null) {
    
                int x = l1 == null ? 0 : l1.val;
                int y = l2 == null ? 0 : l2.val;
    
                int sum = x + y + plus;
    
                plus = sum / 10;
                sum = sum % 10;
    
                cur.next = new ListNode(sum);
                cur = cur.next;
    
                if(l1 != null) l1 = l1.next;
                if(l2 != null) l2 = l2.next;
    
            }
            if(plus == 1) {
                cur.next = new ListNode(1);
            }
    
            //移除虚拟节点
            cur = pre.next;
            pre.next = null;
            //反转回来 
            return reverse(cur);
        }
    
        private ListNode reverse(ListNode head) {
            //反转链表
            private ListNode cur = head, tmp = null, pre = null;
            while(cur != null) {
                tmp = cur.next;
                cur.next = pre;
                pre = cur;
                cur = tmp;
            }
            return pre;
        }
    }
    
    0 赞同 0 条回复

# 回答此问题

后才能回答