链表表示数字相加 go语言版本
发表于:2024-11-23 作者:热门IT资讯网编辑
编辑最后更新 2024年11月23日,链表表示数字相加 go语言版本给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。你可以假设除了数字 0 之外,这两个数字都不会以零开头
链表表示数字相加 go语言版本
给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。你可以假设除了数字 0 之外,这两个数字都不会以零开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
package mainimport "fmt"import "strconv"import "reflect"type ListNode struct { data int next *ListNode}//转成字符串,数字 相加,再转成链表func AddTwoNum(l1 *ListNode, l2 *ListNode) *ListNode { l1Int,_ := strconv.Atoi(reverse(l1)) l2Int,_ := strconv.Atoi(reverse(l2)) l := l1Int + l2Int lStr := strconv.Itoa(l) fmt.Println(reflect.TypeOf(lStr)) fmt.Println(lStr) var newList []*ListNode for _,v := range lStr { fmt.Println(string(v)) n,_ := strconv.Atoi(string(v)) node := &ListNode{data:n} newList = append(newList,node) } head := new(ListNode) tail := head for k,node := range newList { if k == len(newList)-1 { newList = append(newList,nil) } node.next = newList[k+1] tail.next = node tail = tail.next } return head }func reverse(l *ListNode) string { var s string for l != nil { s += strconv.Itoa(l.data) l = l.next } return s}// 反转链表,相加,注意进位func (l *ListNode)AddTwoNumLink(l1 *ListNode) *ListNode { //head := new(ListNode) var head *ListNode head = &ListNode{} newList := new(ListNode) newList = head var newNode *ListNode l = l.reverseLink() l1 = l1.reverseLink() data := 0 carry := 0 //fmt.Println(l,l1) for l != nil || l1 != nil { var data1,data2 int if l != nil { data1 = l.data l = l.next } else { data1 = 0 } if l1 != nil { data2 = l1.data l1 = l1.next } else { data2 = 0 } fmt.Println(data1,data2) data = (data1 + data2 + carry) % 10 newNode = &ListNode{data:data} head.next = newNode carry = (data1 + data2 + carry) / 10 head = head.next } return newList.next.reverseLink()}func (l *ListNode)reverseLink() *ListNode { //pre := new(ListNode) var pre *ListNode next := new(ListNode) for l != nil { next = l.next //fmt.Println(l.next) l.next = pre pre = l l = next } l = pre return l //return pre}func (l *ListNode)readLink() { var result []int for l != nil { result = append(result,l.data) l = l.next } fmt.Println(result)}func main() { node7 := &ListNode{data:7,next:nil} node6 := &ListNode{data:6,next:node7} node5 := &ListNode{data:5,next:node6} node4 := &ListNode{data:4,next: node5} node3 := &ListNode{data:3,next:nil} //node3 := &ListNode{data:3,next:nil} node2 := &ListNode{data:2,next:node3} node1 := &ListNode{data:1,next: node2} //x := AddTwoNum(node1,node4) node1.readLink() //node1.reverseLink().readLink() node1.AddTwoNumLink(node4).readLink() //fmt.Println(r) }