21.E 合并两个有序链表
Problem: 21. 合并两个有序链表
思路
思路1:
先设置一个哨兵指针,设置
pre
为哨兵指针。当
list1
和list2
都不为空时,让pre
指向值较小的链表的节点,然后该链表往后走一步。如果其中一个为空,则把
pre
指向另一个。
思路2:
递归。
如果任意一个链表为空,则返回另一个链表。
否则:
如果
list1
的值较小,则让list1
的节点指向递归合并mergeTwoLists(list1.Next, list2)
的结果如果
list2
的值较小,则让list2
的节点指向递归合并mergeTwoLists(list1, list2.Next)
的结果
Code
代码1:
func mergeTwoListsV1(list1 *ListNode, list2 *ListNode) *ListNode {
var newHead = &ListNode{Val: -1}
var pre = newHead
for list1 != nil && list2 != nil {
if list1.Val <= list2.Val {
pre.Next = list1
list1 = list1.Next
} else {
pre.Next = list2
list2 = list2.Next
}
pre = pre.Next
}
if list1 == nil {
pre.Next = list2
} else {
pre.Next = list1
}
return newHead.Next
}
代码2:
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func mergeTwoLists(list1 *ListNode, list2 *ListNode) *ListNode {
if list1 == nil {
return list2
} else if list2 == nil {
return list1
} else if list1.Val <= list2.Val {
list1.Next = mergeTwoLists(list1.Next, list2)
return list1
} else {
list2.Next = mergeTwoLists(list1, list2.Next)
return list2
}
}
Last updated
Was this helpful?