【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——

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值