20241107,LeetCode 每日一题,使用 Go 计算两数相加

思路

  1. 模拟加法:链表存储的是逆序数位,因此从头节点开始,逐位相加可以模拟正常的加法。每两个节点的值相加,并记录进位。

  2. 逐节点相加

    • 创建一个新的链表,用于存储结果,每次将两个链表对应节点的值加上进位值,结果存储到新链表的节点中。
    • 计算过程中,将(l1.Val + l2.Val + carry)相加的结果拆成两个部分,一部分是当前位的值,另一部分是进位值(例如:(l1.Val + l2.Val + carry) / 10)。
  3. 处理进位:若最终计算完链表后进位不为0,则在结果链表末尾增加一个新节点表示进位。

  4. 边界条件:若链表长度不一,则将缺少的部分视为0;同时确保最后若存在进位,将其单独处理。

代码


type ListNode struct {
	Val  int
	Next *ListNode
}

func addTwoNumbers(l1 *ListNode, l2 *ListNode) (head *ListNode) {
	var tail *ListNode
	carry := 0
	for l1 != nil || l2 != nil {
		var val1, val2 int
		if l1 != nil {
			val1 = l1.Val
			l1 = l1.Next
		}
		if l2 != nil {
			val2 = l2.Val
			l2 = l2.Next
		}
		sum := val1 + val2 + carry
		sum, carry = sum%10, sum/10
		if head == nil {
			head = &ListNode{sum, nil}
			tail = head
		} else {
			tail.Next = &ListNode{sum, nil}
			tail = tail.Next
		}
		if l1 == nil && l2 != nil {
			tail.Next = l2
			break
		}
		if l1 != nil && l2 == nil {
			tail.Next = l1
			break
		}
	}
	if carry > 0 {
		tail.Next = &ListNode{carry, nil}
	}
	return
}
posted @   硅基喵  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示