【Leetcode】两数相加 ( 链表+数组版本)

整体思路就是从个位数加,然后再整个全局变量 jin 代表是否要进 1 这是面试会问的
可能会变形为 两个数组,相加


/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
    dummy := &ListNode{}
    dummy.Next = l1
    cur := dummy
    jin := 0
    for l1 != nil && l2 != nil {
        cur.Next.Val = l1.Val+l2.Val+jin
        if cur.Next.Val >= 10 {
            cur.Next.Val %= 10
            jin = 1
        } else {
            jin = 0
        }
        l1 = l1.Next
        l2 = l2.Next
        cur = cur.Next
    }
    if l1 != nil {
        cur.Next = l1
        cur = cur.Next
        for cur != nil {
            if cur.Val + jin >= 10 {
                cur.Val += jin
                cur.Val %= 10
                cur = cur.Next
                jin = 1
            } else {
                cur.Val += jin
                jin = 0
                break
            }
        }
    }
    if l2 != nil {
        cur.Next = l2
        cur = cur.Next
        for cur != nil {
            if cur.Val + jin >= 10 {
                cur.Val += jin
                cur.Val %= 10
                cur = cur.Next
                jin = 1
            } else {
                cur.Val += jin
                jin = 0
                break
            }
        }
    }
    if jin == 1 {
        cur := dummy.Next
        for cur.Next != nil {
            cur = cur.Next
        }
        a := &ListNode{Val:1}
        cur.Next = a
    }
    return dummy.Next
}

数组版本

// 两个数组,相加
func main() {
	a := []int{6, 5, 3}
	b := []int{1, 8, 4, 2}
	alen := len(a)
	blen := len(b)
	res := make([]int, 0)
	jin := 0
	for i := 0; i < min(alen, blen); i++ { // 注意条件
		// 从最后相加
		aIndex := alen - i - 1
		bIndex := blen - i - 1
		res = append(res, (a[aIndex]+b[bIndex])%10+jin)
		if a[aIndex]+b[bIndex] >= 10 {
			jin = 1
		} else {
			jin = 0
		}
	}
	// 有长的
	if alen > blen {
		for i := blen; i < alen; i++ {
			aIndex := alen - i - 1
			res = append(res, a[aIndex]+jin)
		}
	} else if blen > alen {
		for i := alen; i < blen; i++ {
			bIndex := blen - i - 1
			res = append(res, b[bIndex]+jin)
		}
	} else if jin == 1 {
		res = append(res, 1)
	}
	// 反转
	rlen := len(res)
	for i := 0; i < len(res)/2; i++ {
		res[i], res[rlen-1-i] = res[rlen-1-i], res[i]
	}
	// 切片转化为字符串再转化为整数
	s := ""
	for _, v := range res {
		s += strconv.Itoa(v)
	}
	in, _ := strconv.Atoi(s)
	fmt.Println(in)
}
func min(a, b int) int {
	if a < b {
		return a
	}
	return b
}
func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}

你可能感兴趣的:(leetcode,链表,算法)