leetcode 探索 链表 两数相加

本文介绍了一种将两个升序链表合并成一个新升序链表的方法。新链表由给定的两个链表的所有节点组成。文章详细讨论了解决方案中需要注意的三个关键点:处理进位、链表结束时的特殊情况以及单侧链表继续计算的情况。

题目

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:

输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-two-sorted-lists

分析

合并链表,此题比较简单,但要注意的事情有以下三点。

  1. 该位上的和如果大于等于10的话,需要进位,那么需要将该进位携带到下一轮。
  2. 如果最后两个链表都到头了,但是进位上仍然有值,那么需要新建一个节点存储该值,并连接到链表里。
  3. 如果有一个链表到头了,另外一个链表仍然是要计算结果的,比如在一个链表到头时候,进位了1,另外一链表上的剩余数据是9->9->9这样的,需要一直计算的。

解法

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
    var head = &ListNode{}
    cur := head
    var a, b, add int
    for {
        if l1 == nil && l2 == nil {
        	// 如果遇到两者都结束了,但是add进位上仍然有值,那么仍然要为其新建一个节点,存储该值。
            if add > 0 {
                cur.Next = &ListNode{
                    Val: add,
                }
            }
            break
        }
        // 不为nil的l1和l2指针都要给出值,并前进。
        if l1 != nil {
            a = l1.Val
            l1 = l1.Next
        }
        if l2 != nil {
            b = l2.Val
            l2 = l2.Next
        }
        // 将其与进位值add相加得到和,并计算其余数和新的进位值
        sum := a + b + add
        add = sum / 10
        sum = sum % 10 
        cur.Next = &ListNode{
            Val: sum,
        }
        cur = cur.Next
        // 为什么要置0呢,因为下一轮假如有l1或者l2指针已经为nil了,那么该值将会被重复计算,所以清零
        a, b = 0, 0
    }
    return head.Next
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值