【LeetCode】21. 合併兩個有序鏈表(go語言實現)

一、題目描述

將兩個有序鏈表合併爲一個新的有序鏈表並返回。新鏈表是通過拼接給定的兩個鏈表的所有節點組成的。

示例:

輸入:1->2->4, 1->3->4
輸出:1->1->2->3->4->4

二、題目分析

首先,鏈表全部爲有序鏈表,不用考慮排序的問題,現在只需要考慮比較鏈表元素和合並的問題;只要依次從鏈表頭比較兩個鏈表中的元素大小,然後放到新鏈表中即可,可以重新創建新鏈表節點並返回一個新的鏈表空間,也可以利用舊鏈表的節點,改變指針指向,組合成新鏈表;

注意的點:

  • 輸入可能全部爲空
  • 局部變量初始化
  • 值大小的比較

三、代碼實現

// leetcode_21. 合併兩個有序鏈表
// 歡迎繼續優化代碼

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */

package main

import "fmt"

type ListNode struct {
	Val  int
	Next *ListNode
}

// 初始化 ListNode
func initList(val int) *ListNode {
	return &ListNode{val, nil}
}

// 追加 Node
func appendNode(ln *ListNode, val int) {
	tmp := ln
	if tmp == nil {
		tmp = &ListNode{val, nil}
		return
	}
	for tmp.Next != nil {
		tmp = tmp.Next
	}
	tmp.Next = &ListNode{val, nil}
}

// 追加 List
func appendNodeList(ln *ListNode, node *ListNode) {
	tmp := ln
	if tmp == nil {
		tmp = node
		return
	}
	for tmp.Next != nil {
		tmp = tmp.Next
	}
	tmp.Next = node
}

// 直接操作指針重新連接成所需 List
func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {
	tmp1 := l1
	tmp2 := l2
	tmp3 := new(ListNode)
	tmp3_tmp := tmp3

	for tmp1 != nil && tmp2 != nil {
		if tmp1.Val < tmp2.Val {
			tmp3_tmp.Next = tmp1
			tmp1 = tmp1.Next
		} else {
			tmp3_tmp.Next = tmp2
			tmp2 = tmp2.Next
		}
		tmp3_tmp = tmp3_tmp.Next
	}

	if tmp1 == nil {
		tmp3_tmp.Next = tmp2
	} else if tmp2 == nil {
		tmp3_tmp.Next = tmp1
	}

	return tmp3.Next
}

// 創建並返回新的鏈表
func mergeTwoLists1(l1 *ListNode, l2 *ListNode) *ListNode {
	tmp1 := l1
	tmp2 := l2
	tmp_val := 0
	tmp3 := new(ListNode)

	for tmp1 != nil && tmp2 != nil {
		if tmp1.Val < tmp2.Val {
			tmp_val = tmp1.Val
			tmp1 = tmp1.Next
		} else {
			tmp_val = tmp2.Val
			tmp2 = tmp2.Next
		}
		appendNode(tmp3, tmp_val)
	}

	if tmp1 == nil {
		appendNodeList(tmp3, tmp2)
	} else if tmp2 == nil {
		appendNodeList(tmp3, tmp1)
	}

	return tmp3.Next
}

// 打印結果
func (ln *ListNode) printList() {
	fmt.Printf("list: ")
	for tmp := ln; tmp != nil; tmp = tmp.Next {
		fmt.Printf("%d->", tmp.Val)
	}
	fmt.Printf("nil\n")
}

func main() {
	l1 := initList(1)
	l2 := initList(1)

	appendNode(l1, 2)
	appendNode(l1, 4)
	appendNode(l2, 3)
	appendNode(l2, 4)
	l1.printList()
	l2.printList()

	l3 := mergeTwoLists(l1, l2)
	//l3 := mergeTwoLists(nil, nil)
	l3.printList()
}

運行結果:

list: 1->2->4->nil
list: 1->3->4->nil
list: 1->1->2->3->4->4->nil

Process finished with exit code 0


——2019-09-01——

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章