diff --git a/链表/两数相加/main.go b/链表/两数相加/main.go new file mode 100644 index 0000000..3a7b382 --- /dev/null +++ b/链表/两数相加/main.go @@ -0,0 +1,102 @@ +package main + +type ListNode struct { + Val int + Next *ListNode +} + +func main() { + +} + +//func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode { +// var str1 string +// var str2 string +// +// for l1 != nil { +// if len(str1) < 0 { +// str1 = strconv.Itoa(l1.Val) +// continue +// } +// str1 += strconv.Itoa(l1.Val) +// } +// intnum1 := reverse(str1) +// +// for l2 != nil { +// if len(str2) < 0 { +// str2 = strconv.Itoa(l2.Val) +// continue +// } +// str2 += strconv.Itoa(l2.Val) +// } +// intnum2 := reverse(str2) +// intnum3 := strconv.Itoa(reverse(strconv.Itoa(intnum1 + intnum2))) +// firstNode := (*ListNode)(nil) +// result := (*ListNode)(nil) +// value := 0 +// for i := 0; i < len(intnum3); i++ { +// tmp := &ListNode{} +// if value == 0 { +// tmp.Val = int(intnum3[i]) +// firstNode = tmp +// result = tmp +// value = 1 +// continue +// +// } +// tmp.Val = int(intnum3[i]) +// result.Next = tmp +// result = result.Next +// +// } +// +// return firstNode +//} + +//func reverse(s string) int { +// b := []byte(s) +// for i, j := 0, len(b)-1; i < j; i, j = i+1, j-1 { +// b[i], b[j] = b[j], b[i] +// } +// num, _ := strconv.Atoi(string(b)) +// return num +//} + +func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode { + firstNode := (*ListNode)(nil) + result := (*ListNode)(nil) + value := 0 + + for l1 != nil || l2 != nil { + tmpNode := &ListNode{} + if l1 == nil { + tmpNode.Val = l2.Val + result.Next = tmpNode + result = result.Next + l2 = l2.Next + continue + } else if l2 == nil { + tmpNode.Val = l1.Val + result.Next = tmpNode + result = result.Next + l1 = l1.Next + continue + } + tmpNode.Val = l1.Val + l2.Val + if value == 0 { + firstNode = tmpNode + result = tmpNode + l1 = l1.Next + l2 = l2.Next + value++ + continue + } + result.Next = tmpNode + result = result.Next + l1 = l1.Next + l2 = l2.Next + + } + + return firstNode +} diff --git a/链表/合并两个有序链表/main.go b/链表/合并两个有序链表/main.go index e128ef1..7bfe949 100644 --- a/链表/合并两个有序链表/main.go +++ b/链表/合并两个有序链表/main.go @@ -1,5 +1,7 @@ package main +import "fmt" + type ListNode struct { Val int Next *ListNode @@ -11,10 +13,59 @@ func main() { func mergeTwoLists(list1 *ListNode, list2 *ListNode) *ListNode { upP := list1 dnP := list2 - for upP.Next != nil && dnP.Next != nil { - if upP.Next == nil { - + firstNode := (*ListNode)(nil) + value := 0 + Ponit := (*ListNode)(nil) + if list1 == nil { + if list2 == nil { + return nil } + return list2 + } - return nil + if list2 == nil { + return list1 + } + for upP != nil || dnP != nil { + tmpP := &ListNode{} + + if upP == nil { + tmpP.Val = dnP.Val + Ponit.Next = tmpP + dnP = dnP.Next + + Ponit = Ponit.Next + fmt.Println("停留1") + continue + } + if dnP == nil { + tmpP.Val = upP.Val + Ponit.Next = tmpP + upP = upP.Next + + Ponit = Ponit.Next + fmt.Println("停留2") + continue + } + if upP.Val >= dnP.Val { + tmpP.Val = dnP.Val + dnP = dnP.Next + } else { + tmpP.Val = upP.Val + upP = upP.Next + } + + if value == 0 { + Ponit = tmpP + firstNode = Ponit + value++ + continue + } + Ponit.Next = tmpP + Ponit = Ponit.Next + + value++ + + } + return firstNode }