一、题目描述
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入: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——