题解 | #链表相加(二)#

链表相加(二)

https://www.nowcoder.com/practice/c56f6c70fb3f4849bc56e33ff2a50b6b

package main

import (
	. "nc_tools"
)

/*
 * 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
	if head1 == nil { //空检查
		return head2
	}
	if head2 == nil { //空间查
		return head1
	}
	r1 := reverseList(head1) //反转
	r2 := reverseList(head2) //反转
	dummy := new(ListNode) //新建
	cur := dummy //头,用作后续反转
	plus := 0 //进位器
	for r1 != nil && r2 != nil { //等长情况下
		tmp := r1.Val + r2.Val + plus //相加,进位
		if tmp >= 10 { 
			tmp = tmp % 10
			plus = 1 //进位
		} else {
			plus = 0 
		}
		dummy.Next = new(ListNode) //下个节点存当前数,后续直接用next返回链表,不然会多一个0头
		dummy.Next.Val = tmp
		r1 = r1.Next //进位
		r2 = r2.Next//进位
		dummy = dummy.Next //进位
	}
	var r3 *ListNode
	if r1 != nil {
		r3 = r1
	}
	if r2 != nil {
		r3 = r2
	}
	for r3 != nil { //多余长度的链表
		tmp := r3.Val + plus //相同操作
		if tmp >= 10 {
			tmp = tmp % 10
			plus = 1
		} else {
			plus = 0
		}
		dummy.Next = new(ListNode)
		dummy.Next.Val = tmp
		r3 = r3.Next
		dummy = dummy.Next
	}
	if plus >= 1 {
		dummy.Next = new(ListNode) //新建进位
		dummy.Next.Val = plus
	}
	return reverseList(cur.Next) //去除0头,并反转
}
func reverseList(lists *ListNode) *ListNode { //反转链表
	var pre, cur *ListNode
	for lists != nil { //不要用next
		cur = lists //当前
		lists = lists.Next //移入下一个
		cur.Next = pre //指向前一个
		pre = cur //进位
	}
	return cur
}

全部评论

相关推荐

03-19 10:07
已编辑
广东药科大学 golang
Yki_:你倒是进一个面啊
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务