法一:
解题思路:
新建一个链表存储两个链表相加的各位数之和,注意进位,由于链表是逆序,只要依次往右进位即可,进位数要用一个变量存储起来。
main函数:
func main{
l1:=&ListNode{}
node1:=l1
node1.Val=3
node2:=&ListNode{}
node2.Val=4
node1.Next=node2
node3:=&ListNode{}
node3.Val=4
node2.Next=node3
l2:=&ListNode{}
h1:=l2
h1.Val=5
fmt.Println("l2值=%d",l2.Val)
h2:=&ListNode{}
h2.Val=7
h1.Next=h2
h3:=&ListNode{}
h3.Val=8
h2.Next=h3
h4:=&ListNode{}
h4.Val=1
h3.Next=h4
ans:=addTwoNumbers(l1,l2)
for ans.Next!=nil{
fmt.Println(ans.Val)
ans=ans.Next
}
//fmt.Println(ans)
}
函数部分:
func addTwoNumbers(l1 *ListNode, l2 *ListNode) (head *ListNode) {
//定义一个临时指针(可移动指针)
var tail *ListNode
//定义两个存放L1、L2链表结点的变量 进位值
carry:=0
n1,n2:=0,0
//依次遍历l1,l2链表
//链表不为空,则将链表头结点指针指向的值赋给n1,链表指针偏移到下一个结点
if l1!=nil{
n1=l1.Val
l1=l1.Next
}
//跟l1同理
if l2!=nil {
n2=l2.Val
l2=l2.Next
}
//将两个链表结点的值相加,再加上进位值
sum:=n1+n2+carry
//定义一个新链表,将加得的值存储到新链表
if head==nil{
head=&ListNode{Val:sum}
tail=head
}else{
tail.Next=&ListNode{Val:sum}
tail=tail.Next
}
if carry>0{
tail.Next=&ListNode{Val:carry}
}
return
}
时间复杂度:O(max(m,n)),其中 mm 和 nn 分别为两个链表的长度。
空间复杂度(1)