有空更新系列 - 练手算法 - go(二)


package main

import "fmt"

/**
题目:给定两个有序链表的head1和head2,打印两个有序链表的公共部分
 */
func main() {

	fmt.Println("start")

	// 创建测试数据
	head1, head2 := createTestList()
	fmt.Printf("head1:%v|head2:%v", head1.next, head2.next)
	fmt.Println()

	fmt.Println("公共部分为:")
	for head1.next != nil && head2.next != nil {
		node1 := head1.next
		node2 := head2.next

		// 相同说明则是公共部分,两条链表一起往后移动,查看下一个值是否相同
		if node1.value == node2.value {
			fmt.Printf("%v", node1.value)
			fmt.Println()
			head1 = head1.next
			head2 = head2.next
		}

		// 如果第一条链表的数据更大,则第二条链表王后裔
		if node1.value > node2.value {
			head2 = head2.next
		}

		// 如果第二条链表的数据更大,则第一条链表王后裔
		if node1.value < node2.value {
			head1 = head1.next
		}

	}

	fmt.Println()
	fmt.Print("end")
}

type ListNode struct {
	value int64
	next  *ListNode
}

func newListNode(value int64) *ListNode {
	return &ListNode{
		value: value,
		next: nil,
	}
}

func createTestList() (head1 *ListNode, head2 *ListNode) {
	list1 := []int64{4, 6, 7, 9, 21, 50, 75, 112}
	list2 := []int64{3, 6, 7, 9, 19, 50, 60, 112}

	head1 = &ListNode{}
	nextNode1 := head1
	for _, value := range list1 {
		node := newListNode(value)
		nextNode1.next = node
		nextNode1 = nextNode1.next
	}

	head2 = &ListNode{}
	nextNode2 := head2
	for _, value := range list2 {
		node := newListNode(value)
		nextNode2.next = node
		nextNode2 = nextNode2.next
	}

	return
}