题目描述
假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。给定两个这种链表,请生成代表两个整数相加值的结果链表。
例如:链表 1 为 9->3->7,链表 2 为 6->3,最后生成新的结果链表为 1->0->0->0。
牛客链接:
https://www.nowcoder.com/practice/c56f6c70fb3f4849bc56e33ff2a50b6b?tpId=117&&tqId=35073&rp=1&ru=/ta/job-code-high&qru=/ta/job-code-high/question-ranking
解题思路:
采用两种方法
第一种用辅助栈
第二种不用辅助栈,原地解决
代码一:
用辅助栈
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
}
var stk1 [] *ListNode
var stk2 [] *ListNode
temp1 := head1
temp2 := head2
for temp1!=nil || temp2!=nil {
if temp1 != nil {
stk1 = append(stk1, temp1)
temp1 = temp1.Next
}
if temp2 != nil {
stk2 = append(stk2, temp2)
temp2 = temp2.Next
}
}
cnt1 := len(stk1)-1
cnt2 := len(stk2)-1
flag := false
var stkResult []*ListNode
var cnt int
if cnt1 >= cnt2 {
stkResult = stk1[:]
cnt = cnt1
} else {
stkResult = stk2[:]
cnt = cnt2
}
for cnt>=0 {
var add1 int
var add2 int
if cnt1>=0 {
add1 = stk1[cnt1].Val
cnt1--
} else {
add1 = 0
}
if cnt2>=0 {
add2 = stk2[cnt2].Val
cnt2--
} else {
add2 = 0
}
var sum int
if flag == false {
sum = add1 + add2
} else {
sum = add1 + add2 +1
}
if sum>=10 {
flag = true
sum = sum-10
} else {
flag = false
}
stkResult[cnt].Val = sum
cnt--
}
cnt1 = len(stk1)
cnt2 = len(stk2)
if cnt1 >= cnt2 {
temp1 = head1
if flag==true {
head2.Val = 1
head2.Next = head1
temp1 = head2
}
} else {
temp1 = head2
if flag==true {
head1.Val = 1
head1.Next = head2
temp1 = head1
}
}
return temp1
}
代码二:
不用辅助栈
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
}
//把两个链表分别翻转
temp1 := head1
temp2 := head2
len1 := 0
len2 := 0
var pre1 *ListNode = nil
var pre2 *ListNode = nil
for temp1!=nil || temp2!=nil {
if temp1 != nil {
len1++
temp := temp1.Next
temp1.Next = pre1
pre1 = temp1
temp1 = temp
}
if temp2 != nil {
len2++
temp := temp2.Next
temp2.Next = pre2
pre2 = temp2
temp2 = temp
}
}
//把head1赋给长度较长的链表
if len1 >= len2 {
head1 = pre1
temp1 = pre1
} else {
head1 = pre2
head2 = pre1
temp1 = pre2
}
flag := false
//在head1的基础上进行链表相加
for pre1!=nil || pre2!=nil {
add1 := 0
add2 := 0
if pre1!=nil {
add1 = pre1.Val
pre1 = pre1.Next
}
if pre2!=nil {
add2 = pre2.Val
pre2 = pre2.Next
}
sum := 0
if flag {
sum = add1 + add2 + 1
} else {
sum = add1 + add2
}
if sum>=10 {
sum = sum-10
flag = true
} else {
flag = false
}
temp1.Val = sum
temp2 = temp1
temp1 = temp1.Next
}
//若进位超出,将和head2加入head1的链表
if flag {
head2.Val = 1
temp2.Next = head2
}
//翻转head1在的链表
temp1 = head1
pre1 = nil
for temp1 != nil {
temp2 = temp1.Next
temp1.Next = pre1
pre1 = temp1
temp1 = temp2
}
return pre1
}
注意:
辅助栈用切片实现
切片的操作
链表翻转