package main

import "fmt"

type ListNode struct {
	Val  int
	Next *ListNode
}

func main() {
	// fmt.Print("hello")
	data1 := []int{1, 2, 4}
	data2 := []int{1, 3, 4}
	list1 := new(ListNode)
	p1 := list1
	list2 := new(ListNode)
	p2 := list2
	for i := 0; i < len(data1); i++ {
		tmp := new(ListNode)
		tmp.Val = data1[i]
		p1.Next = tmp
		p1 = tmp
	}
	for i := 0; i < len(data2); i++ {
		tmp := new(ListNode)
		tmp.Val = data2[i]
		p2.Next = tmp
		p2 = tmp
	}
	list3 := mergeTwoLists(list1.Next, list2.Next)
	for list3 != nil {
		fmt.Print(list3.Val)
		list3 = list3.Next
	}
}

func mergeTwoLists(list1 *ListNode, list2 *ListNode) *ListNode {
	head := new(ListNode)
	node := head
	for list1 != nil && list2 != nil {
		if list1.Val <= list2.Val {
			tmp := new(ListNode)
			tmp.Val = list1.Val
			node.Next = tmp
			node = tmp
			list1 = list1.Next
		} else if list1.Val > list2.Val {
			tmp := new(ListNode)
			tmp.Val = list2.Val
			node.Next = tmp
			node = tmp
			list2 = list2.Next
		}
	}
	for list1 != nil {
		tmp := new(ListNode)
		tmp.Val = list1.Val
		node.Next = tmp
		node = tmp
		list1 = list1.Next
	}
	for list2 != nil {
		tmp := new(ListNode)
		tmp.Val = list2.Val
		node.Next = tmp
		node = tmp
		list2 = list2.Next
	}
	return head.Next
}
