链表相加二(链表 相加)

链表相加二

  • 先反转链表,再模拟加法运算,最后反转链表

题目描述

假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。 给定两个这种链表,请生成代表两个整数相加值的结果链表。

例如:链表 1 为 9->3->7,链表 2 为 6->3,最后生成新的结果链表为 1->0->0->0。

示例

输入:[9,3,7],[6,3]
返回值:{1,0,0,0}

C++实现

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head1 ListNode类 
     * @param head2 ListNode类 
     * @return ListNode类
     */
    ListNode* addInList(ListNode* head1, ListNode* head2) {
        // write code here

        // 1. reverse link list
        // 2. add operation
        // 3. reverse
        ListNode *h1 = reverse(head1);
        ListNode *h2 = reverse(head2);

        ListNode *h = nullptr, *p = nullptr;
        pair<int, int> carry = {0, 0};
        for (ListNode *p1=h1, *p2=h2; p1 || p2 || carry.second > 0;) {
            int val1 = p1 ? p1->val : 0;
            int val2 = p2 ? p2->val : 0;
            if (p1) p1 = p1->next;
            if (p2) p2 = p2->next;

            int sum = val1 + val2 + carry.second;
            carry = {sum%10, sum/10};

            ListNode *q = new ListNode(carry.first);
            if (!h) {
                h = q;
                p = q;
            } else {
                p->next = q;
                p = q;
            }
        }

        ListNode *ret = reverse(h);
        return ret;
    }

private:
    ListNode* reverse(ListNode* head) {
        ListNode *prev = nullptr;
        ListNode *curr = head;
        while (curr) {
            ListNode *next = curr->next;
            curr->next = prev;
            prev = curr;
            curr = next;
        }
        return prev;
    }
};

golang实现

package main

import (
	//"fmt"
	. "nc_tools"

	//"golang.org/x/text/currency"
)

/*
 * type ListNode struct{
 *   Val int
 *   Next *ListNode
 * }
 */

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param head1 ListNode类
 * @param head2 ListNode类
 * @return ListNode类
 */
func addInList( head1 *ListNode ,  head2 *ListNode ) *ListNode {
    // write code here
    h1 := reverse(head1)
    h2 := reverse(head2)

    // add operator
    var h, p *ListNode
    carry := [2]int{0, 0}
    for p1,p2 := h1,h2; p1 != nil || p2 != nil || carry[1] > 0; {
        val1, val2 := 0, 0
        if p1 != nil {
            val1 = p1.Val
            p1 = p1.Next
        }
        if p2 != nil {
            val2 = p2.Val
            p2 = p2.Next
        }
        sum := val1 + val2 + carry[1]
        carry = [2]int{sum%10, sum/10}

        // create link list
        q := &ListNode{Val: carry[0]}
        if h == nil {
            h = q
            p = q
        } else {
            p.Next = q;
            p = q;
        }
    }

    ret := reverse(h)
    return ret
}

func reverse(head *ListNode) *ListNode {
    var prev *ListNode
    curr := head
    for curr != nil {
        next := curr.Next
        curr.Next = prev
        prev, curr = curr, next
    }
    return prev
}
原文链接:,转发请注明来源!